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...