C++高手请进!能告诉我解决这道题的思想是什么吗?

来源:百度知道 编辑:UC知道 时间:2024/05/10 02:16:32
/*编程计算1!+2!+3!+4!+........+20!*/
//能告诉我解决这道题的思想是什么吗?
#include <iostream>
using namespace std;
int main()
{
int c[3]={1,0,0},m=2,t[3]={1,0,0};
for(m=1;m<=20;++m)
{
t[0]*=m;
t[1]*=m;
t[2]*=m;
t[1]+=(t[0]/10000000);
t[0]%=10000000;
t[2]+=(t[1]/10000000);
t[1]%=10000000;

c[0]+=t[0];
if(c[0]>10000000)
{
++c[1];
c[0]%=10000000;
}
c[1]+=t[1];
if(c[1]>10000000)
{
++c[2];
c[1]%=10000000;
}
c[2]+=t[2];
}
cout<<"1!+2!+3!+......+20!="<<c[2]<<c[1]<<c[0]<<endl;
return 0;
}
看了各位的答复,还是觉得很难理解,知道要分割,但是就掌握不到这道题的关键,难道是理解还不行?快疯了……
各位高手能对着程序解析吗?
会加分的!!!!!

不需要高手, 呵呵:
因为结果太大,单个变量存不下, 那就分成3个7位. t[2],t[2],t[0],和c[2],c[1],c[0]一样分别是两个数的低七位中七位和高七位.
假设T=t[2]*10000000^2+t[1]*10000000+t[1](如果变量空间够大的话)

t[0]*=m;
t[1]*=m;
t[2]*=m;
t[1]+=(t[0]/10000000); //t[1]=t[1]+t[0]的进位
t[0]%=10000000; //t[0]砍掉进位还原成7位数
t[2]+=(t[1]/10000000); //同上
t[1]%=10000000;
完成的功能是T*=m,
其实整段程序是这样的:
T=1;C=0;
for(m=1;m<=20,++m){
T*=m;
C+=T;
}
但由于T和C都被分成了三段(其实就是把它们看作10000000进位的数), 所以看起来就复杂了.

比如有个十进制的一个数有100位;
为了能计算其数的基本运算
需要将其 分割

将每20位分给一个变量
int[5] a;
在运算中 只要判断其每段的结果大于20位的部分加到前一段去
对应的每段就进行正常的运算即可

一个int整数表示不了,进位。
其实20!用64位整数(__int64,或long long)是可以表示的

因为在32位机上int类型是32位的,也就是int能储存的最大的正数是2^31-1,而阶乘计算的结果往往比较大,很容易超过int的上限,所以这个程序用3个int来表示计算结果。

t[2]、t[1]、t[0]是用来存储阶乘
c[2]、c[1]、c[0]是用来存储累加阶乘的

为什么不用double来表示,对于20!用double来表示已经够了。