我希望将两个大小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;
}
持有这个数字并使用它的最佳方法是什么?
答案 0 :(得分:6)
将其存储为两个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
答案 1 :(得分:2)
您可以使用各种策略实现任意大的数值。
我个人喜欢使用链表。想法是将每个数字存储在节点中。您需要分别实现加法,减法,乘法和除法功能。
答案 2 :(得分:2)
在64位架构上,long long
最多可容纳2 ^ 63-1。最多32位:2^32 -1
。如果您需要更大的数字,那么如果有更好的方法来解决问题,您应该重新评估您正在做的事情。
如果您需要更大的数字,则必须创建自己的库或使用其他人的库:
这是两个处理任意精度数的库。您可以使用的数字大小的限制取决于您必须保存和计算它们的磁盘空间,内存和处理能力。
如果你必须自己滚动,你可以将它存储在一个整数数组中。 64位整数只是两个32位整数。 1024位整数也可以看作32个32位整数。创建一个包含整数数组的类,将它们拼接成您需要的任何大小。然后,困难的部分就是编写函数,这些函数可以加减乘法并除以整数数组。