算階乘的幾種方法

2021-09-02 08:14:58 字數 2091 閱讀 9929

1.利用陣列來算階乘

思路:思路:用data陣列來存放階乘的每一位數字,首先令第一位的數值為1,位數為1,然後將每次相乘的乘積存回陣列,並迴圈處理每個陣列中超過10的數,若數值超過10,則需要進製,將位數加1,原來的數除以10,商數加前一位數的數值後存回前一位數的陣列中,再將餘數存回原來位數的陣列中。

例如求5!的值

步驟一:

1!=1

位數1陣列內容0      0      0      1

步驟二:

2!=2*1!=2

位數1陣列內容0      0      0      2

步驟三:

3!=3*2!=3*2=6

位數1陣列內容0      0      0      6

步驟四:

4!=4*3!=4*4=24

位數1陣列內容0      0      0      24

因為24大於10,需要進製

data[1]=data[1]+data[0]/10=0+2=2

data[0]=data[0]=4

所以陣列內容為0      0      2      4

位數2步驟五:

5!=5*4!=5*24=120

位數2陣列內容為0      0      2*5      4*5

即0      0      10      20

因為data[0]大於10,需要進製

data[1]=data[1]+data[0]/10=10+2=12

data[0]=data[1]=0

此時陣列內容為0      0      12      0

data[2]=data[2]+data[1]/10=0+1=1

data[1]=data[1]=2

位數加1

陣列內容為0      1      2      0

一次類推,可以計算大數的階乘,**如下:

example program

#include #include #include int main()

while (carry)

}printf("the result is :\n%d ! = ",n); //顯示結果

for(int i = digit; i >=1; --i)//輸出結果

return 0;

}

我們可以對上面的演算法進行優化,陣列中的每個數僅僅用來表示一位,對於整型變數的範圍來說,這顯得有些浪費。於是我們將陣列中的每個元素來記錄最終答案的多位,這樣就可以縮短迴圈的次數。例如,陣列的每一位用來記錄結果的9位,用1000000000代替10來進行進製操作。最後在輸出時,如果a[i]=0,表示我們要輸出9個0,因為每個位置記錄了9位

優化**如下

example program

#include #include #include #define ll long long

const ll max = 1000000000;

int main()

while (carry)

} printf("the result is :\n%lld ! = ",n); //顯示結果

printf("%lld",a[digit-1]); //首先輸出最高位的元素,因為最高位的元素並不一定有9位

for(ll i = digit-1; i >=1; --i)

return 0;

}

2.遞迴進行

// example program

#include

#include

#include

long long factorial(long long n)

int main()

3. 迴圈計算

// example program

#include

#include

#include

long long factorial(long long n)

return sum;

}int main()

python學習 計算階乘的幾種方法

方法一 很普通的for迴圈語句 a 1 n 5 for i in range 1,n 1 a a i print a 得到結果 120方法二 採用上篇博文提到的reduce 函式 from functools import reduce n 5 print reduce lambda x,y x y...

回顧基礎知識 實現階乘計算的幾種方法

首先想到是遞迴,其次用到高階函式reduce 再其次,還在想。1 求階乘的幾種方法2 1 遞迴思想 3def jx max 4if max 1 5return 1 6return max jx max 1 78 2 函式式程式設計的思想 9def jx2 10 l range input pleas...

TIdTCPClient的幾種方法

其實indy比較簡單,但是可以提供的方法太多了。我找了很久,才搞明白。比方說這個讀取緩衝區的資料,就有很多種方法。相對於ttcpclient的幾種方法來說,tidtcpclient確實提供了多種選擇,不仔細研究真的容易糊塗 其實我比較喜歡用currentreadbuffer 1 readfromst...