如何在C中划分愚蠢的大数字

时间:2010-12-13 14:23:50

标签: c math biginteger integer-division

我正在学习C并且认为Project Euler问题将是一种有趣且有趣的学习方法(并且会因为它会让我一直在思考数学而一刀杀2只鸟)但我已经打了一个障碍。

我(我认为)是一个很好的(如果简单的)算法,用于查找数字的最大素数因子。它有效(据我测试过),但PE问题使用600851475143作为最后一个问题。我曾试图使用双打等,但我似乎永远都找不到模数和除法运算符。任何帮助将不胜感激。

附加代码是在我开始使用双打(或任何其他类型)之前:

#include<stdio.h>
#include <math.h>

void main() {
    int target, divisor, answer;
    target = 375;
    divisor = 2;
    answer = -1;

    answer = factorise (target,divisor);

    printf("Answer to Euler Problem 3: %i\n", answer);
}

int factorise(number, divisor) {
    int div;
    while (divisor < number) {
        div = divide(number,divisor);
        if (div) {number = div;}
        else {divisor++;}
    }
    return divisor;
}

int divide(a,b) {
    if (a%b) {return 0;}
    else {return a/b;}
}

3 个答案:

答案 0 :(得分:4)

您是否尝试过longlong long?根据您的编译器,这些可能会起作用。但是你最终还是需要一个bigint库来解决其他PE问题。互联网上有一些,但是因为你这样做是为了学习我建议自己编写。

答案 1 :(得分:2)

C标准规定了整数类型的下限:

char: 127 (2^7 - 1)
short: 32767 (2^15 - 1)
int: 32767 (2^15 - 1)
long: 2147483647 (2^31 - 1)
long long (C99): 9223372036854775807 (2^63 - 1)

如果Project Euler使用C99编译器,则保证long long

此外,这些是最小值。我认为Project Euler的long是64位,因此long也适用于C89

答案 2 :(得分:1)

C99中最大的整数类型是long long,你可以试试这个。

您无法使用double进行精确的积分计算,因为大数字不精确。