我想把10^10的两个数字乘以,结果是10^20,也就是2^66。
我希望将该数字存储在C中的标准数据类型中。我宁愿不使用"GNU MP Bignum库“。
为什么下面的C程序不能正确地保存这个数字?
#include<stdio.h>
typedef long long int ull;
int main(){
ull n1 = 10000000000LL;
ull n2 = 10000000000LL;
printf("%llu",n1*n2);
return 0;
}什么是最好的方式来保持这个数字并与它合作?
发布于 2013-08-10 19:53:58
将其存储为两个long long值。下面是一个解决方案的草图:
#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;
}产出:
result in hex is 56bc75e2d63100000发布于 2013-08-10 19:38:27
您可以使用各种策略实现任意大的数值。
我个人喜欢使用链接列表。这样做的目的是将每个数字存储在一个节点中。您需要分别实现加法、减法、乘法和除法函数。
发布于 2013-08-10 19:54:07
https://stackoverflow.com/questions/18165641
复制相似问题