intmain(){inti=1,n,s=1,sum=0;
scanf("%d",&n);
while(i<=n){s*=i;s%=1000000;sum+=s;i++;}sum%=1000000;
printf("%dn",sum);
return0;}
这题看描述是十分容易的,我却纠结了很久.还三番四次请陈选帮忙.
我纠结的主要原因是溢出的问题.
由于阶乘这种恶心的东西.很快位数会不够用的了.

这里顺便反思一下自己.在我刚看到题目时,想着很容易实现,也没多加思考就开始打开VS自HI般地打起了代码.等写完后.运行小的整数还行.但大于忘记几的时候就搞不定了.这时才开始想问题在哪.当然问题其实是很明显的.阶乘这种东西的增加速度十分快.很快int就会用爆了.
那要想解决方法呀.这时我就去查比int还打的整型.遗憾的是没有.(我编译器的int和long是一样长的)然后又想到了用unsigned取消掉负号的定义来增多一位.但于事无补.阶乘增长速度太快了.无奈下百度了很多阶乘求和的代码.恍然明白其实只要每次求完都只保留后六位加起来就好了.这样下去就可以让你的结果不溢出.不过我的作法还是不好.之后就请教了陈选.这段代码就是他的.比我的简单很多.递交成功后试了几个结果我又困惑了:输100200201结果都是94013(忘了是不是.大概是这么个数)然后又怀疑有问题.其实这表明我还没完全弄懂这段代码.然后试了好几个数.最后确定从n=24开始后面都是94013.陈选又给了tips.就是2*5=10;然后后面又有10;总之后面有的数乘起来为10的倍数的.叠起来乘.就把后六位都变成0了.那就是说.自24起.后面所有数的后六位皆零.所以就保持在94013了.
搞懂后.是觉得很简单的.但那时的我脑子就没转过来.
所以也印前面博文讲过的.不要用思考后的脑子觉得问题有多简单.而要想自己花了多长时间才搞懂问题.所以我也不是羞于写出这些总结.尽管应该很多聪明人一下搞懂了.并且在我现在看来我的确觉得之前没想出很弱.不过我同时会把那句话挂心里.所以心里也没太难受.