繁体   English   中英

如何在C中愚蠢地分解大数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM