我正在学习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;}
}
答案 0 :(得分:4)
您是否尝试过long
或long 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
进行精确的积分计算,因为大数字不精确。