首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法用C++中的12位数字计算素数因子

无法用C++中的12位数字计算素数因子
EN

Stack Overflow用户
提问于 2012-02-16 21:00:27
回答 2查看 805关注 0票数 1

我正在尝试通过在Project Eular Page:http://projecteuler.net/problems上做例子来学习更多关于C代码的知识。现在我正在试着从数字600851475143中计算出最高的素因数。下面是我的代码:

代码语言:javascript
复制
/* The prime factors of 13195 are 5, 7, 13 and 29.

What is the largest prime factor of the number 600851475143 ?*/
#include <stdio.h>

unsigned long long GetPrimeFactor(unsigned long long number)
{
    /* printf("The number you typed was %d\n", number);*/
    unsigned long long prime = 2;
    unsigned long long LargestPrime = 0;

    while (prime != 0)
    {
        if(number%prime == 0)
        {
            if(number == prime)
            {
                if(LargestPrime < prime)
                    LargestPrime = prime;

                printf("End of prime factors \nLargest Prime: %d\nEnding Number: %d\n", LargestPrime, number);
                break;
            }
            else if(LargestPrime < prime)
                LargestPrime = prime;

            //divide number by prime

            number = number/prime;
            printf("Prime: %d\n", prime);
        }

        else
        {
            //get new prime
            prime = nextPrimeNumber(prime);
        }
    }
}

unsigned long long nextPrimeNumber(unsigned long long input)
{
    unsigned long long nextPrimeNumber;

    while(input !=0)
    {
        if( input < 0)
        {
            printf("The number you have entered is negative\n");
        }
        else if (input > 0)
        {
            nextPrimeNumber = input + 1;

            if(nextPrimeNumber%2 == 0 && nextPrimeNumber != 2)
            {
                nextPrimeNumber += 1;
            }

            while(!isPrime(nextPrimeNumber))
            {
                nextPrimeNumber += 2;
            }

            return nextPrimeNumber;
        }
    }
}

int isPrime(int number)
{
    int i;
    int prime = 1; //true

    if(number == 2)
        prime = 0; //false

    if(number%2 == 0 || number <= 1)
        prime = 0;
    else
    {
        for(i=3; i<sqrt(number) && prime == 1; i+=2)
            if(number%i == 0)
                prime = 0;
    }

    return prime;
}

int main(void)
{
    unsigned long long number;

    printf("Enter a Number: \n");
    scanf("%d", &number);
    GetPrimeFactor(number);

    return 0;
}

此代码适用于示例中的数字13195,但当我尝试更大的数字时,它会变得很糟糕,我不确定哪里出了问题。

输出大数字600851475143:质数:3质数: 29质数: 5108231等等,这是不正确的,因为这个数字无论如何都不能被3整除。

我不能找出哪里出了问题,所以任何帮助都会很好

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-16 21:05:13

Signed ints上升到2147483647,unsigned ints上升到4294967295,你可以使用unsigned long long,它上升到18446744073709551615,如果你需要更大的东西,可以使用像GnuMP ( http://gmplib.org/)这样的任意精度/基准库

对您编辑的问题的更新:

如果你使用的格式说明符甚至没有读取整个unsigned long long,我在某个地方读到你必须使用%llu,但是在我的gcc上这不起作用,我不得不使用:

代码语言:javascript
复制
printf("Enter a Number: \n");
scanf("%I64d", &number);
printf("%I64d", number);  // <- make sure that this prints the number you 
                 // gave it before even calling GetPrimeFactor()
票数 2
EN

Stack Overflow用户

发布于 2012-02-16 21:29:16

你换过scanf了吗?

代码语言:javascript
复制
scanf("%L", &number)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9311714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档