首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用C存储10^20的值?

如何用C存储10^20的值?
EN

Stack Overflow用户
提问于 2013-08-10 19:34:51
回答 3查看 1.1K关注 0票数 0

我想把10^10的两个数字乘以,结果是10^20,也就是2^66

我希望将该数字存储在C中的标准数据类型中。我宁愿不使用"GNU MP Bignum库“。

为什么下面的C程序不能正确地保存这个数字?

代码语言:javascript
复制
#include<stdio.h>
typedef long long int ull;
int main(){

    ull n1 = 10000000000LL;
    ull n2 = 10000000000LL;

    printf("%llu",n1*n2);
    return 0;
}

什么是最好的方式来保持这个数字并与它合作?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-10 19:53:58

将其存储为两个long long值。下面是一个解决方案的草图:

代码语言:javascript
复制
#include <stdio.h>

typedef unsigned long long ull;

void multiply( ull a, ull b, ull * lo, ull * hi )
{
  ull ah = a >> 32;
  ull bh = b >> 32;
  ull al = a & 0xFFFFFFFF;
  ull bl = b & 0xFFFFFFFF;

  ull mid = ah * bl + al * bh;
  ull albl = al * bl;

  ull imm = mid + ( albl >> 32 );

  *lo = ( mid << 32 ) + albl;
  *hi = ah * bh + ( imm >> 32 );
}

int main()
{
  ull n1 = 10000000000LL;
  ull n2 = 10000000000LL;

  ull lo, hi;

  multiply( n1, n2, &lo, &hi );

  printf( "result in hex is %llx%016llx\n", hi, lo );
  return 0;
}

产出:

代码语言:javascript
复制
result in hex is 56bc75e2d63100000
票数 6
EN

Stack Overflow用户

发布于 2013-08-10 19:38:27

您可以使用各种策略实现任意大的数值。

我个人喜欢使用链接列表。这样做的目的是将每个数字存储在一个节点中。您需要分别实现加法、减法、乘法和除法函数。

票数 2
EN

Stack Overflow用户

发布于 2013-08-10 19:54:07

在64位架构上,long long最多只能容纳2^63-1。最多32位:2^32 -1。如果你需要更大的数字,那么如果有更好的方法解决问题,你应该重新评估你正在做的事情。

如果您需要更大的数字,您必须创建自己的库或使用其他人的库:

以下是处理任意精确数字的两个库。您可以使用多大的数字的限制取决于磁盘空间、内存和处理能力的大小,您必须持有和计算它们。

GMPMAPM

如果必须滚动自己的,则可以将其存储在整数数组中。64位整数只是两个32位整数.一个1024位整数也可以看作是32位整数.创建一个包含整数数组的类,将它们拼接成任意大小。最困难的部分是编写函数,这些函数可以对整数数组进行加、减、乘和除法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18165641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档