[英]How to divide stupidly big numbers in C
在学习C时,我认为欧拉计画的问题将是一种有趣而有趣的学习方式(并且会用1块石头杀死2只鸟,因为它也会使我继续思考数学),但是我遇到了麻烦。
我有(我认为是)一种很好的算法(如果很简单),可以找到数字的最大素数。 它可以工作(就我所测试的而言),但PE问题使用600851475143作为最后一个问题。 我曾尝试使用double等,但我似乎再也找不到模和除法运算符了。 任何帮助将不胜感激。
附加的代码是在我开始使其与doubles(或任何其他类型)一起使用之前的:
#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;}
}
您尝试了long
还是long long
? 根据您的编译器,这些可能会起作用。 但是最终您将需要一个bigint库来解决其他PE问题。 互联网上有一些,但是既然您正在学习,我建议您自己编写。
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
C89
64位,因此C89
也可以使用long
。
C99中最大的整数类型是long long
,您可以尝试这个。
您无法使用double
进行精确的积分计算,因为使用大数不精确。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.