2

正在学习 C 并认为Project Euler问题将是一种有趣且有趣的学习方式(并且会用 1 块石头杀死 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;}
}
4

3 回答 3

4

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

于 2010-12-13T14:29:36.937 回答
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 的longs 是 64 位的,所以long也应该适用于C89.

于 2010-12-13T14:43:27.467 回答
1

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

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

于 2010-12-13T14:28:49.870 回答