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了.
搞懂后.是覺得很簡單的.但那時的我腦子就沒轉過來.
所以也印前面博文講過的.不要用思考后的腦子覺得問題有多簡單.而要想自己花了多長時間才搞懂問題.所以我也不是羞于寫出這些總結.盡管應該很多聰明人一下搞懂了.并且在我現在看來我的確覺得之前沒想出很弱.不過我同時會把那句話掛心里.所以心里也沒太難受.
愛華網



