c语言要计算20,用C语言计算1~20的阶乘之和
昨天(2018/12/7)在做C語(yǔ)言的課后練習(xí)題的時(shí)候,有一道題要求我們計(jì)算1~20的階乘之和。代碼很快就寫出來(lái)了,考慮到結(jié)果的值會(huì)比較大,而在Windows操作系統(tǒng)下,int 類型和 long 類型居然都是4個(gè)字節(jié)(C#中l(wèi)ong類型是八個(gè)字節(jié),找同學(xué)試了下,Linux下C語(yǔ)言的long類型好像也是八個(gè)字節(jié)),所以我使用double類型。代碼如下:
1 #include
2
3 intmain()4 {5 double n = 1, sum = 0;6 for (int i = 1; i <= 20; i++)7 {8 n *=i;9 sum +=n;10 }11 printf("%lf",sum);12 }
結(jié)果輸出了:2561327494111820300.000000
我以為我得到了正確的結(jié)果,但我將同樣的算法搬到C#中之后,卻好像不是那么回事。(考慮到C#中l(wèi)ong類型是八個(gè)字節(jié),范圍足夠大,所以在C#中我直接使用了long類型。)代碼如下:
1 usingSystem;2 usingSystem.Collections.Generic;3 usingSystem.Linq;4 usingSystem.Text;5 usingSystem.Threading.Tasks;6
7 namespaceHomework8 {9 classProgram10 {11 static void Main(string[] args)12 {13 long n = 1, sum = 0;14 for (int i = 1; i <= 20; ++i)15 {16 n *=i;17 sum +=n;18 }19 Console.WriteLine(sum);20 Console.ReadKey();21 }22 }23 }
得到的結(jié)果是:2561327494111820313
相差了13?什么鬼?我不(ji)厭(qi)其(wu)煩(liao)的按著計(jì)算器(科學(xué)計(jì)算器里有求階乘的函數(shù)),得到的結(jié)果和我在C#里得到的一模一樣。那C得出來(lái)的是什么鬼(其實(shí)在C#里將long改成double,得出來(lái)的好像也有誤差)。而且我嘗試著在輸出結(jié)果之前,手動(dòng)把sum加上了13,即在輸出之前加入這么一條語(yǔ)句“sum += 13;”,發(fā)現(xiàn)……并沒(méi)有什么用,結(jié)果還是 2561327494111820300.000000。那……加100?沒(méi)用!加200?沒(méi)用!加300?神奇的事情發(fā)生了,得到了 2561327494111820800.000000!???等下,這不是加了500麼,我只給它加了300。。。哭笑不得。
對(duì)于具體原因我沒(méi)有搞懂,可能是浮點(diǎn)數(shù)在計(jì)算機(jī)里的存儲(chǔ)和計(jì)算有關(guān)吧,可能造成了舍入誤差。反正就是數(shù)據(jù)類型的問(wèn)題。
那在Windows環(huán)境下用C語(yǔ)言做這道題,還得用 long long 類型。于是乎,C語(yǔ)言的代碼變成了:
1 #include
2
3 intmain()4 {5 long long n = 1, sum = 0;6 for (int i = 1; i <= 20; i++)7 {8 n *=i;9 sum +=n;10 }11 printf("%I64d",sum);12 }
輸出說(shuō)明符是“%I64d”,百度來(lái)的。總之結(jié)果是對(duì)了:2561327494111820313。
所以,您也別糾結(jié)網(wǎng)上有的回答 2561327494111820300 得到了200+贊,卻同時(shí)得到了600+踩了。至于得到結(jié)果 268040729 的,要么是int類型溢出(Windows操作系統(tǒng)下C語(yǔ)言的 long 類型也會(huì)溢出),要麼是結(jié)果輸出的時(shí)候用了“%d”格式說(shuō)明符導(dǎo)致溢出。
PS:long long數(shù)據(jù)類型好像是C99標(biāo)準(zhǔn)增加的,而VC++6.0(別問(wèn)我為什么說(shuō)到這個(gè)東西)是在C99之前出現(xiàn)的東西,所以以上代碼在VC++6.0里并不能使用。另外,VC++6.0也不支持“for (int i = 1; i <= 20; i++)”這種寫法,變量 i 的聲明得在for循環(huán)語(yǔ)句之前聲明。
原文:https://www.cnblogs.com/Luquan/p/10088319.html
總結(jié)
以上是生活随笔為你收集整理的c语言要计算20,用C语言计算1~20的阶乘之和的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 求1加到20的阶乘
- 下一篇: 风险评估模型蒙特卡洛模型_R模型中的蒙特