我也闲来无事,研究了一种另类的大数计算方法:题目素材采自c坛子里的 国王赏赐宰相的米粒的问题
程序代码:
#include <stdio.h> //指数运算 _int64 _pow(int base,int p) { int i=0; _int64 ret=1; if (p==0) return 1; for(i=1;i<=p;i++) { ret=ret*base; } return ret; } //把一个大的_int64拆分成2个小的_int64 void long2short(_int64 source,_int64* high,_int64* lower) { *lower=source % 1000000000; *high=source/1000000000; } //判断一个_int64的长度 int longintlen(_int64 source) { int tmp=0; while(source>0) { source/=10; tmp++; } return tmp; } //把2个_int64合成一个大的_int64 //目标返回值需要调用者分配内存并初始化'\0' void longint2char(_int64 high,_int64 lower,char dest[]) { int hlen=longintlen(high); int wlen=longintlen(lower); while(lower>0) { dest[hlen+wlen-1]=lower%10+0x30; lower/=10; wlen--; } while(high>0) { dest[hlen-1]=high%10+0x30; high/=10; hlen--; } } int main() { int k; _int64 sum=0,tmp=0; char dest[20]={'\0'}; for(k=0;k<63;k++) { tmp=_pow(2,k); sum+=tmp; } _int64 _h,_l; long2short(sum,&_h,&_l); _int64 _l2=_l*2+1; int flag=_l2/1000000000; _l2=_l2 % 1000000000; _int64 _h2=_h*2+flag; longint2char(_h2,_l2,dest); printf("%s\n",&dest[0]); return 0; }
最终输出:
F:\c_source\t5\Debug>t5
18446744073709551615 //应该和答案一致