1. 程式人生 > 其它 >洛谷P1009 [NOIP1998 普及組] 階乘之和

洛谷P1009 [NOIP1998 普及組] 階乘之和

本質上是高精度模板的運用

但我聽說用python打表更快,羨慕了

比較容易寫錯,這裡少了一些,那裡字母又打錯

錯誤總結:

有些表示式也有可能寫錯

 cheng[i + 1] =cheng[i+1]+cheng[i] / 10;
//這裡我第一次寫就少了等號右邊的cheng[i+1],並在n=5的階乘之和發現,並除錯修改

還有判斷陣列有效數字長度的錯誤,算出來的是陣列的長度,不是需要計算或列印的

length=sizeof(sum)/sizeof(sum[0]);

由於是階乘的計算,名命名一個全域性變數,從頭用到尾

AC程式碼:

用兩個陣列儲存,一個處理結果(階乘),一個用於表達階乘

#include<iostream>
#include
<string> #include<cmath> using namespace std; int cheng[5500];//表達階乘 int ans[5500];//表達階乘的和 int length = 1; void gaojia(); void gaocheng(int x) { int yinzi = x; for (int i = 0; i < length; i++) cheng[i] = cheng[i] * yinzi; //每個數乘以因子 for (int i = 0; i < length; i++) { cheng[i
+ 1] =cheng[i+1]+cheng[i] / 10; cheng[i] = cheng[i] % 10; } if (cheng[length++] == 0) length--; //高精度A*B的模板 gaojia();//將階乘加到總和ans } void gaojia() { for (int i = 0; i < length; i++) ans[i] = ans[i] + cheng[i]; for (int i = 0; i < length; i++) { ans[i
+ 1] = ans[i+1]+ans[i] / 10; ans[i] = ans[i] % 10; } if (ans[length++] == 0) length--; //高精度A+B模板 } int main() { int n; cin >> n; ans[0] = 0; cheng[0] = 1; for (int i = 1; i <= n; i++) { gaocheng(i); //傳遞要乘數字給函式 } for (int i = length - 1; i >= 0; i--) cout << ans[i]; //輸出 return 0; }

本文來自部落格園,作者:magicat,轉載請註明原文連結:https://www.cnblogs.com/magicat/p/15089329.html