沒辦法,今天是賊不爽的一天,就這個大數階乘搞了我一天,搞得我頭昏腦脹,所以今天必須得吐槽一下。不得不說,要做出這題,邏輯思維一定要縝密。廢話少說,直接上題。
題目描述
輸入乙個正整數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。否則我也沒想到其他的法子。解題思想就是你把每次計算出的結果用陣列儲存,a[0]存個位,a[1]存十位,a[2]存百位~~~~~~再把訪問的結果也就是陣列的每一位分別與n相乘,在把每一位相乘結果相加又得到乙個新的陣列,迴圈這個過程,直到乘以n;一開始想的就是如何讓這些結果相加,然後發現了乙個規律,b[i] = b[i] + (a[j]/(int)pow(10,cnt) ) % 10,也就是說,假如你要得到百位結果a[2],就可以用a[2]%10+a[1]/10 + a[0]/100 % 10;通過這種規律就可以寫出相加的**。
c++**如下:
#include
#include
#include
using
namespace std;
int a[
100001];
int b[
100001];
int n;
int flag;
intlength
(int num)
return len;
}int
pow(
int num)
return sta;
}void
mult
(int n,
int len)
return;}
for(
int i =
0; i < len; i ++
) len =
length
(a[len -1]
)+ len +1;
int temp =0;
for(
int i =
0; i < len ; i ++
)else flag =0;
for(
int j = flag; j <= i; j ++
) b[i]
+= temp;
if(b[i]
>=10)
else
temp =0;
}for
(int i =
0; i < len; i ++
)memset
(b,0
,sizeof
(b))
;mult
(n +
1,len)
;return
;}
我這裡有些東西做的不夠精確,也只是為了過測試點,就比如結果的位數我是沒有仔細考慮的,只能讓位數增大,去除前面的0,得到結果,還有就是用了兩個陣列,但畢竟是為了刷題,也沒有什麼好法子了,直接ac就對了。 C語言大數的階乘
首先由題了解到一般資料型別大小是儲存不了如此大的數字的階乘的,所以要採用陣列儲存的方式。每一位陣列元素儲存一位數字,最後再輸出整個陣列便是 核心。首先定義乙個函式用來將運算結果存入陣列 int into int k,int x,int length while jw length n 1 計算次數變...
c語言求大數階乘,10000的階乘
10000以內階乘,在c語言中沒有型別可以以儲存這麼大的數,所以我們可以用陣列來存它,int a 10005 這裡10005只是習慣,當然,也可以用斯特靈公式來算a陣列的大小 下面附上 題解請看 注釋,include int a 100000 int main 這層迴圈使得a陣列每個數都是個一位數 ...
N的階乘 大數階乘
輸入n求n的階乘的準確值。input 輸入n 1 n 10000 output 輸出n的階乘 首先,要確定n的階乘的數字大概有多少位,這樣便於我們去選擇合適的演算法。階乘 當n 10000時,上式值為35660 已經向上取整 所以接受 include include include include ...