編程求解1!+2!+3!+…+19!+20!的值,這個題怎么做。我的程序應該是對的。結果一直運行錯誤。
uj5u.com熱心網友回復:
20!很大了,裝不下了,供參考:#include<stdio.h>
int main()
{
int i;
__int64 s=0,tmp=1;
for(i=1;i<=20;i++)
{
tmp *= i;
s+=tmp;
}
printf("%I64d\n",s);
return 0;
}
uj5u.com熱心網友回復:
這樣是不是就明白一些int main()
{
/*
* 1!+2!+3!+…+19!+20!
*
* 1*1 + 2*1 + 3*2*1 + 4*3*2*1 +
* */
//一個數用來保存每一項階乘
double last = 1;
//一個數用來求和
double sum = 0;
//從1到20
for (int i = 1; i <= 20; i++)
{
last *= i; //i=1 => 1*(1) i=2 => 2*(1*1) i=3 => 3*(2*1*1) i=4 => 4*(3*2*1*1)
sum += last; //累加起來
}
//列印結果
printf("sum = %lf\n", sum);
return 0;
}
uj5u.com熱心網友回復:
剛才試了。謝謝哈不過第四行和倒數第二行代碼,我不太理解

uj5u.com熱心網友回復:
懂了,謝謝哈

uj5u.com熱心網友回復:
在做ACM題時,經常都會遇到一些比較大的整數。而常用的內置整數型別常常顯得太小了:其中long 和 int 范圍
是[-2^31,2^31),即-2147483648~2147483647。而unsigned范圍是[0,2^32),即0~4294967295。也就是說,
常規的32位整數只能夠處理40億以下的數。
那遇到比40億要大的數怎么辦呢?這時就要用到C++的64位擴展了。不同的編譯器對64位整數的擴展
有所不同。VC6.0的64位整數分別叫做__int64與unsigned __int64,其范圍分別是[-2^63, 2^63)與[0,2^64),即-9223372036854775808~9223372036854775807與0~18446744073709551615(約1800億億)。對64位整數的運算與32位整數基本相同,都支持四則運算與位運算等。
uj5u.com熱心網友回復:
測驗了一下,你的程式輸出結果是:
sum = 2561327494111820288.000000
個人感覺這個結果是不對的,因為這個結果應該是一個奇數,而不是偶數;
last和sum定義為unsigned long long后得到的結果是
sum = 2561327494111820313
將last和sum定義為long double后就沒問題了,得到了:
sum = 2561327494111820313.000000
另外,對于long double的輸出建議用%.0Lf格式輸出,因為階層和不會得到一個浮點數(實數),應該得到一個整數才對;
uj5u.com熱心網友回復:
我暈了,哪一個方法是對的呀

uj5u.com熱心網友回復:
這樣是不是就明白一些
int main()
{
/*
* 1!+2!+3!+…+19!+20!
*
* 1*1 + 2*1 + 3*2*1 + 4*3*2*1 +
* */
//一個數用來保存每一項階乘
double last = 1;
//一個數用來求和
double sum = 0;
//從1到20
for (int i = 1; i <= 20; i++)
{
last *= i; //i=1 => 1*(1) i=2 => 2*(1*1) i=3 => 3*(2*1*1) i=4 => 4*(3*2*1*1)
sum += last; //累加起來
}
//列印結果
printf("sum = %lf\n", sum);
return 0;
}
測驗了一下,你的程式輸出結果是:
sum = 2561327494111820288.000000
個人感覺這個結果是不對的,因為這個結果應該是一個奇數,而不是偶數;
last和sum定義為unsigned long long后得到的結果是
sum = 2561327494111820313
將last和sum定義為long double后就沒問題了,得到了:
sum = 2561327494111820313.000000
另外,對于long double的輸出建議用%.0Lf格式輸出,因為階層和不會得到一個浮點數(實數),應該得到一個整數才對;
感謝對小白的指正,在變數型別方面我還存在許多不足
uj5u.com熱心網友回復:
這樣是不是就明白一些
int main()
{
/*
* 1!+2!+3!+…+19!+20!
*
* 1*1 + 2*1 + 3*2*1 + 4*3*2*1 +
* */
//一個數用來保存每一項階乘
double last = 1;
//一個數用來求和
double sum = 0;
//從1到20
for (int i = 1; i <= 20; i++)
{
last *= i; //i=1 => 1*(1) i=2 => 2*(1*1) i=3 => 3*(2*1*1) i=4 => 4*(3*2*1*1)
sum += last; //累加起來
}
//列印結果
printf("sum = %lf\n", sum);
return 0;
}
測驗了一下,你的程式輸出結果是:
sum = 2561327494111820288.000000
個人感覺這個結果是不對的,因為這個結果應該是一個奇數,而不是偶數;
last和sum定義為unsigned long long后得到的結果是
sum = 2561327494111820313
將last和sum定義為long double后就沒問題了,得到了:
sum = 2561327494111820313.000000
另外,對于long double的輸出建議用%.0Lf格式輸出,因為階層和不會得到一個浮點數(實數),應該得到一個整數才對;
我暈了,哪一個方法是對的呀
跟方法沒關系的。是型別運算出現的問題。這位朋友給你推薦的演算法沒問題的,而是變數的型別有點問題,改成long double(自測)就可以。
當然,用unsigned long long也是沒問題的。
這也是樓主需要注意的,需要考慮型別的取值范圍,考慮是否會溢位以及型別的運算等等
uj5u.com熱心網友回復:
好的好的,謝謝大家uj5u.com熱心網友回復:
過來學習,謝謝分享轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/284977.html
標籤:C語言