基礎練習 階乘計算
時間限制:1.0s 記憶體限制:512.0mb
問題描述
輸入乙個正整數n,輸出n!的值。
其中n!=123*…*n。
演算法描述
n!可能很大,而計算機能表示的整數範圍有限,需要使用高精度計算的方法。使用乙個陣列a來表示乙個大整數a,a[0]表示a的個位,a[1]表示a的十位,依次類推。
將a乘以乙個整數k變為將陣列a的每乙個元素都乘以k,請注意處理相應的進製。
首先將a設為1,然後乘2,乘3,當乘到n時,即得到了n!的值。
輸入格式
輸入包含乙個正整數n,n<=1000。
輸出格式
輸出n!的準確值。
樣例輸入
10樣例輸出
3628800
分析:由於數值位數肯定很大,故不能用常規的數數相乘的思路去算。
關鍵點在設計程式的時候,計算出某個位乘以i加上進製,然後**取個位數(對10取餘)**作為自己的當前陣列更新的值,其他的進製送給下一次迴圈。
例如:算到某個位置(假如該乘以i=99)時候,a[0]=2,a[1]=2,a[2]=1,a[3]=1(即該數為為1122,陣列是逆向儲存的9(方便從第一位計算以及更新位數)。
計算過程如下:
a[0]
*99+0
=2*99
=198(此時,更新a[0]
=8,需要進製的值為19)a[1
]*99+
19=2*
99+19=
217(此時,更新a[1]
=7,需要進製的值為21)a[2
]*99+
21=1*
99+21=
120(此時,更新a[2]
=0,需要進製的值為12)a[3
]*99+
12=1*
99+12=
111(此時,更新a[3]
=1,需要進製的值為11)
上面四行是第二層for迴圈需要做的事情。
而此時進製為11,可是原來的資料是四位數(第0位--
-第3位)已經更新,
那麼如何處理這個進製11呢(while迴圈裡面需要做的事情),
繼續向第4位以及第5位拓展(因為11是兩位數,兩位即可),即a[4]
=1,a[5]=
1所以最後更新好的時候:a[0]
=8,a[1]=
7,a[2]
=0,a[3]=
1,a[4]
=1,a[5]=
1
ac**如下:
#include
#include
using
namespace std;
#define n 30000
//給陣列的每個位置賦值為初始值1
int a[n]=;
intmain()
while
(temp)
//更新更多出來的進製(可能不止一位)
pos--
;//上面的pos++使得最後的pos多加了乙個1,所以此時要取消多加的那乙個1
maxpos = pos > maxpos? pos :maxpos;
//求更新後的值得最大位數
}for
(int i=maxpos;i>=
0;i--
)//逆序輸出最後的答案
cout<; cout
}
(藍橋杯)基礎練習 階乘計算
時間限制 1.0s 記憶體限制 512.0mb 問題描述 輸入乙個正整數n,輸出n 的值。其中n 1 2 3 n。演算法描述 n 可能很大,而計算機能表示的整數範圍有限,需要使用高精度計算的方法。使用乙個陣列a來表示乙個大整數a,a 0 表示a的個位,a 1 表示a的十位,依次類推。將a乘以乙個整數...
藍橋杯 基礎練習 階乘計算
時間限制 1.0s 記憶體限制 512.0mb 問題描述 輸入乙個正整數n,輸出n 的值。其中n 1 2 3 n。演算法描述 n 可能很大,而計算機能表示的整數範圍有限,需要使用高精度計算的方法。使用乙個陣列a來表示乙個大整數a,a 0 表示a的個位,a 1 表示a的十位,依次類推。將a乘以乙個整數...
藍橋杯基礎練習 階乘計算
輸入乙個正整數n,輸出n 的值。其中n 1 2 3 n。n 可能很大,而計算機能表示的整數範圍有限,需要使用高精度計算的方法。使用乙個陣列a來表示乙個大整數a,a 0 表示a的個位,a 1 表示a的十位,依次類推。將a乘以乙個整數k變為將陣列a的每乙個元素都乘以k,請注意處理相應的進製。首先將a設為...