基礎練習 階乘計算(藍橋)

2021-10-02 04:56:50 字數 1778 閱讀 3689

基礎練習 階乘計算

時間限制: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設為...