【问题标题】:How to divide stupidly big numbers in C如何在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;}
}

【问题讨论】:

标签: c math biginteger integer-division


【解决方案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)。是的,长长的更好。
    猜你喜欢
    • 2019-03-16
    • 2015-12-06
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 2012-11-18
    相关资源
    最近更新 更多