c++ 求sum(n!),n可以為極大的數 並程式計算執行時間
阿新 • • 發佈:2018-12-09
此程式為用C++求1! + 2! + 3! + …… + n!
其中n可以為極大的數,通常情況下double型只能存放1! + 2! + 3! + …… + 170!採用陣列的方法儲存資料可以做到算無窮大的數的階乘的和,期限制因素只在於程式中定義的陣列的大小。假如有比該程式更高的要求,可以更改陣列大小,以得到正確結果。
#include <iostream> #include <time.h> using namespace std; int main() { clock_t start, stop; int n, step = 0; do //進行輸入 { cout << "please input n:\n"; cin >> n; start = clock(); //獲得開始時間 if (n == 0) //n == 0的情況 { cout << "sum(0!)= 1\n"; break; } if (n > 0) //n > 0的情況 { int num[30] = {0}; //儲存n的陣列 int mul[10000] = {0}; //儲存n! int sum[10000] = {0}; //儲存n!的和 mul[0] = 1; int b = 1; for (int numb = 1; numb <= n; numb++) //n次迴圈 { int mult[10000] = {0}; //暫存numb! int j = 0, nu = numb, i, k; do //將numb的數值存到數值中 { num[j] = nu % 10; nu = nu / 10; j++; } while (nu != 0); for (int i = 0; i < j; i++) //求numb! { for (int k = 0; k < b; k++) { mult[i + k] += num[i] * mul[k]; } } /////////////////////////////// b = b + j - 1; //總位數為numb的位數+ (numb - 1)!的位數 for (int i = 0; i < b; i++) //進位 { mult[i + 1] += mult[i] / 10; mult[i] %= 10; } if (mult[b] != 0) //如果最高位上有進位,位數加一 { b++; } for (int i = 0; i < b; i++) //將numb!的結果儲存 { mul[i] = mult[i]; } ////////////////////////// for (int i = 0; i < b; i++) //求numb!的和 { sum[i] += mul[i]; } for (int i = 0; i < b; i++) //進位 { sum[i + 1] += sum[i] / 10; sum[i] %= 10; } ///////////////////////////////////// } cout << "sum(" << n << "!) = "; //輸出n!的和 for (int i = b - 1; i >= 0; i--) { cout << sum[i]; } cout << endl; break; } else //n為非法字元的情況 { cout << "the num you input is ileagall!\n"; } step++; } while(step < 3); //三次輸入錯誤 stop = clock(); //獲得結束時間 cout << "use time :" << (double)(stop - start) / CLOCKS_PER_SEC << “(s)” << endl; //輸出所用時間 return 0; }
以下為1! + 2! + 3! + …… + 10!的執行結果:
以下為1! + 2! + 3! + …… +200!的結果:
程式中尚有很多不足之處,請初學者通讀、思考之後採用,也希望各位大神多加指點。
程式中階乘和進位部分有參考。