int result[] = new int[65500];
int tempres[] = new int[655500];
int i,j,k,m,n,o,q,temp,bit,tempbit;
double s = 1;
tempbit = 0;
for(int l = 2; l 0 || j >= 10) {
j = j / 10;
o = m;
q = 0;
while(q = 10){
temp = temp / 10;
temp = temp + tempres[n];
tempres[n] = temp % 10;
if(n >= tempbit){
tempbit++;
}
n++;
}
if(n >= tempbit){
tempbit = n;
}
q++;
}
m++;
}
bit = tempbit;
for(int p = bit - 1; p >= 0; p--){
int(tempres[p]);
result[p] = tempres[p];
tempres[p] = 0;
}
intln();
}
for(int p = bit - 1; p >= 0; p--){
int(result[p]);
}
因为我手上没有C方面的环境,所以我用java来写的
你只要把 intln();这个输出语句,换成C的就可以
还是说一下程序吧
因为1000!的结果非常大,所以不可能通过普通的方式来存储
也因此只有选用int数组来存储(如果int数组还不行就换long吧)数组的每一个数用来存储每一位数字,这样就可以存储6万多位,应该够大了吧!
然后是算法的问题,有两种方式
一:用加法迭代 即把每一次的乘法转换成加法 比如:10*11 转换成11个10相加(你可以自己试着用这种方法写一下)
二:用乘法 即用被乘数的每一位去乘以乘数 比如:10*11 转换成 1*10 1*10,但是后面这个1*11的结果要前移一位,使它能转换成100
第一种方法实现较为简单,但运行速度可能要慢点
第二种方法实现较为复杂,但运行速度要快点
以下是101!的结果
9。
425947759838354E159(这是double方式的结果,看样如果是10000!double都无能为力)
942594775983835942085。。。
(太长了,但可以看到和double运行的结果的前面几位是相同的,所以也应该是正确的)
我花了大概五个小时才搞定(人老人,脑子也不行了)我没有写注释,希望你一个小时内能看懂(锻炼一下你自己)
另外,我那么辛苦应该再加点分吧(强烈要求^_^)
祝你好运。
全部