n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1
沒有考慮變數表達範圍,假設所得結果用long型表示。
這裡需要注意的是0的階乘應該是1.
#include using這個程式的主要問題就是long的選取,long型是4個位元組,32位,因為是帶符號的,能表示的範圍最大不超過2的31次方,即不超過10的10次方。namespace
std;
int main(int argc, char*argv)
}else
if (n == 0
)
cout
<< result <
}return0;
}
即long型可以表示的數肯定是十進位制下的10位數之內的。
而14的階乘就已經是乙個11位數了。
(事實上13的階乘就已經超過了long的表示範圍,因為13的階乘的最高位是6,而2的31次方最高位是2。)
所以這個程式只能計算12以下的數的階乘。
考慮過將資料型別進一步改為long double,得到的結果是科學計數法顯示的,只有有限的有效數字,精度不高,並且當n進一步增大再次超過表示範圍的時候呢?所以還是需要另外的處理辦法。
當n大於等於20時,因為運算結果超出了long型的表示範圍,所以必須採取大數字的一般處理方法:用陣列表示。
程式如下,自己寫的,沒有仔細研究文後的參考資料。
#include using還是需要細心一些的。namespace
std;
int main(int argc, char*argv)
;
int bitcount = 0;//
記錄所用到的位數下標
while( cin >>n)
//然後進行階乘運算
while( --n > 0
)
while(carry > 0
)
}//最後輸出運算結果
for(int i = bitcount; i >= 0; --i)
cout
<
}else
if (n == 0
)
else
}return0;
}
主要檢查迴圈變數是否更新,對於進製的理解是否正確等。
結果用計算器驗證過,並且在九度上提交通過:
大數運算(採用陣列模擬):
8,演算法題 求N的階乘
這道演算法題一般考查的遞迴的程式設計技能,那麼我們回顧下遞迴程式的特點 1,什麼是遞迴?遞迴,就是方法內部呼叫方法自身 遞迴的注意事項 找到規律,編寫遞迴公式 找到出口 邊界值 讓遞迴有結束邊界 注意 如果遞迴太多層,或者沒有正確結束遞迴,則會出現 棧記憶體溢位error 問題 為什麼會出現棧記憶體...
計算n的階乘
c語言學習初期,相信你肯定編寫過 計算n的階乘 吧!怎麼樣,是不是覺得過於簡單了呢?哈哈,就讓我們再次回溫這道題,詳解它的編寫過程 從最初的構思到具體的設計,體會乙個腦海中的idea切切實實轉化為 的奇妙過程 下面進入正題 說明 本題我們暫時不 溢位問題,所以就拿 計算5的階乘 舉例 思路構想 計算...
筆試題 計算N的階乘
public class test stringbuilder tmpsb new stringbuilder sum for j i j len1 1 0 result add result,tmpsb.tostring else stringbuilder tmpsb new stringbui...