藍橋杯 階乘運算 大數階乘

2021-10-09 16:58:48 字數 1748 閱讀 8626

題目

問題描述:輸入乙個正整數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,請注意處理相應的進製。...