題目
問題描述:輸入乙個正整數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
這道題給的演算法描述,說是:用陣列來儲存運算的結果,將階乘所得的結果,每一位數字佔據乙個陣列元素,進行儲存。並且按照位數從低到高開始。
我沒有採取完全相同的方法,因為,依據題意可以知道,n的值最大可以是1000,那麼1000階乘所得的結果必然十分大,如果一位數儲存在乙個陣列元素的位置中,那麼總體所需的陣列所佔據的記憶體空間必然十分大。
首先,我無法估量具體的1000階乘的位數,所以在定義陣列大小時,利用靜態陣列不好確定陣列的大小;其次,就算利用動態陣列來進行儲存,那麼,當階乘所得結果很大的時候,記憶體不一定可以儲存,或者說,測評系統所給的記憶體不一定夠。
所以,我選擇一種變形的方式進行儲存----每個陣列元素單元,儲存4位數字,進製與本位的運算後保留的值,通過模餘運算求得:
for
(k=1
;k<=j;k++
)
同時,需要注意的是,由於本位進製後留得的數字是由曲餘得到的,所以需要保證在輸出的時候把省略的「0」補出來。
即,最高位所在陣列元素單元除外,其他的陣列元素單元中,如果數字位數<4位,輸出時,應用「0」,將數字位數補夠4位,具體實現如下:
printf
("%d"
,a[j]);
for(i=j-
1;i>=
1;i--)}
}
源**:
//n的階乘問題
//最大的是1000的階乘
//大約等於4*10的2567次方
//所以,定義乙個陣列,a[1001]
//從下標位1開始儲存
//每個陣列元素儲存4位數字
//在乘的過程中依次處理進製
// #include
intmain()
;scanf
("%d"
,&n)
; a[1]
=1; j=1;
//j的值表示的是當前所佔的最大的陣列元素位置的下標
cf=0;
//初始進製位值是0
for(i=
2;i<=n;i++
)while
(cf!=0)
//存在進製,多占用乙個陣列元素的位置
//需要注意的是,可能進製的數,超過9999,
//即,需要再次進製
// printf("\n");
}printf
("%d"
,a[j]);
for(i=j-
1;i>=
1;i--
)//輸出的時候需要考慮
//除最高位所在的陣列元素單元外
//其他陣列單元,如果數字 位數<4
//需要考慮補0 的情況 }}
return0;
}
藍橋杯 階乘
description 乙個整數n的階乘可以寫成n 它表示從1到n這n個整數的乘積。階乘的增長速度非常快,例如,13 就已經比較大了,已經無法存放在乙個整型變數 中 而35 就更大了,它已經無法存放在乙個浮點型變數中。因此,當n比較大時,去計算n 是非常困難的。幸運的是,在本題中,我們的任務不是去計...
藍橋杯 階乘計算(大數乘法)
基礎練習 階乘計算 時間限制 1.0s 記憶體限制 512.0mb 問題描述 輸入乙個正整數n,輸出n 的值。其中n 1 2 3 n。演算法描述 n 可能很大,而計算機能表示的整數範圍有限,需要使用高精度計算的方法。使用乙個陣列a來表示乙個大整數a,a 0 表示a的個位,a 1 表示a的十位,依次類...
藍橋杯之階乘計算(大數問題)
輸入乙個正整數n,輸出n 的值。其中n 1 2 3 n。演算法描述 n 可能很大,而計算機能表示的整數範圍有限,需要使用高精度計算的方法。使用乙個陣列a來表示乙個大整數a,a 0 表示a的個位,a 1 表示a的十位,依次類推。將a乘以乙個整數k變為將陣列a的每乙個元素都乘以k,請注意處理相應的進製。...