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

Posted

技术标签:

【中文标题】如何在C中划分愚蠢的大数字【英文标题】:How to divide stupidly big numbers in C 【发布时间】:2010-12-13 14:23:50 【问题描述】:

我正在学习 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;

【问题讨论】:

看相关问题:***.com/questions/1384160/… 好吧,long long 就可以了。 64 位,大约 9 x 10^18。 【参考方案1】:

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

【讨论】:

我很确定我的编译器不会对 long 或 long long 做任何有用的事情,所以看来我将制作自​​己的 bigint 库!谢谢。 “但既然你这样做是为了学习,我建议你自己写”????编写任何类型的正确数学库都非常困难。如果要学习,那是一回事,但如果要定期使用,我总是更喜欢由知道如何正确执行此操作的人构建的信誉良好的库。 (这来自在他那个时代编写了大量数学库函数的人) @Jason S 最初的问题是针对 Project Euler,而不是针对生产代码。 一个好的/坏的基础对项目的影响是一样的,无论是爱好还是生产工作。继续这个比喻,如果我有质量有问题的水泥,我不想将它用于后院棚屋或大型公寓楼。如果我想学习如何制作自己的水泥,我会将其作为自己的测试项目;我不会用它来做后院棚子。【参考方案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

【讨论】:

【参考方案3】:

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

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

【讨论】:

感谢您澄清这一点 - 不知道双打是不精确的!会记住的! 对于 52 位以下的整数来说,双精度是精确的,这对于 600851475143 来说已经足够了。当然,long long 更好。 最多 53 位 (2^53)。是的,长长的更好。

以上是关于如何在C中划分愚蠢的大数字的主要内容,如果未能解决你的问题,请参考以下文章

如何删除在 git 中错误提交的大文件 [重复]

如何在不使用 VBA 的情况下在 Excel 中转换 HEX 和 DEC 之间的大数字?

如何设置数字格式以显示C ++中的所有十进制数字? [关闭]

在 Xcode 中创建带有标题的大导航栏

如何在逻辑上划分为段的地图上显示标记(巨大的数字)?

javascript中的大数字