【问题标题】:Sum of very large numbers非常大的数字的总和
【发布时间】:2017-09-21 19:42:17
【问题描述】:

所以我想知道如何获得非常大的数字(10 或更多)的总和。 例如:

number1 = 10481481258125812;
number2 = 10041284812488248;
number3 = 10041248812482488;

我想将这些数字相加并存储到一个名为 sum 的变量中,但我以前从未在 C 语言中处理过如此大的数字。

谢谢!

【问题讨论】:

  • 你用什么类型来表示这些?
  • 在这种特定情况下,一个 64 位整数就足够了。
  • 也许你想要一个 bignum 库,比如 GMPlib... 或者只是 long longint64_t

标签: c


【解决方案1】:

使用 64 位整数

如果你想使用小于 64 位的数字,你可以使用 int64_t / uint64_t / long long。 这些类型的最大尺寸:

  • int64_t: 2^63 - 1 = 9,223,372,036,854,775,807
  • uint64_t: 2^64 -1 = 18,446,744,073,709,551,615

int64_t 和 uint64_t 定义在stdint.h

使用 gmplib

如果你想处理更大的数字,你可以使用GMPlib。一个简单的教程:https://www.cs.colorado.edu/~srirams/courses/csci2824-spr14/gmpTutorial.html

【讨论】:

    【解决方案2】:

    试试这个:

    #include <stdio.h>
    int main ()
    {
        long long number1 = 10481481258125812;
        long long number2 = 10041284812488248;
        long long number3 = 10041248812482488;
        long long sum = number1 + number2 + number3;
        printf("sum : %lld",sum);
    
    }
    

    【讨论】:

    • long 不保证为 64 位。
    • long 通常与 int 长度相同。当您对必须表示的数据大小有特定要求时,最好使用 stdint.h 库和 int64_t 等类型,因为它可以便携地确保满足要求。
    • 谢谢!我使用的是 long long int 但我在 printf 中使用了 %d 而不是 %lld 所以难怪它显示了一些随机数。
    【解决方案3】:

    使用支持更大数字的long long。在某些编译器中你也可以使用long long long,但是你没有提到你正在使用的编译器。

    更多信息请参见https://en.wikipedia.org/wiki/C_data_types

    【讨论】:

    • 你能举出支持long long long的特定编译器吗?它在哪个平台上运行?维基百科文章没有提到类型。
    【解决方案4】:

    unsigned long long 可以处理如此大的数字,最多至少 64 位:

    #include <stdio.h> 
    
    int main() {
        unsigned long long number1 = 10481481258125812;
        unsigned long long number2 = 10041284812488248;
        unsigned long long number3 = 10041248812482488;
        unsigned long long sum = number1 + number2 + number3;
        printf("sum: %llu\n", sum);
    }
    

    【讨论】:

    • unsigned long long建议"%llu"
    • 谢谢!我使用的是 long long int 但我在 printf 中使用了 %d 而不是 %lld 所以难怪它显示了一些随机数。
    • @Abhi_Meruga:您可以通过单击分数下方的灰色复选标记来接受其中一个答案。
    【解决方案5】:

    类型 long long 被指定为具有至少 63 个值位和 unsigned long long 64 个值位。

    一些编译器(gcc 和 clang)支持更大的 128 位整数类型,如 __int128__int128_t__uint128__uint128_t。这些是非标准类型,C 库通常不支持它们,因此您需要自己编写与字符串之间的转换函数。

    除此之外,您还需要一个 Arbitrary Precision Arithmetic 包,例如 GNU multiple precision library

    【讨论】:

      猜你喜欢
      • 2019-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多