高精度演算法是每個初學者的入門必備,在我們做題目的時候,總會遇到一下精度太高的問題,即使用了long long也遠遠不夠。所以學習高精度也是很有必要的。本篇文章就以下面這道題為例子,簡單介紹一下高精加和高精乘。
洛谷原題
洛谷部落格題解
本蒟的思路就是高精乘+高精加,就是把高精乘的模板套上去接著套高精加的模板,b=c=i的階乘。
話不多說,直接上**:
#include
#include
using
namespace std;
int n,a[90]
,b[90
],c[90]
,f[90
],d=
0,len_a,len_b=
1,len_c=
1,len_ans,m=1;
string s;
intmain()
for(
int j=
0;j)//計算a*b(i*(i-1)的階乘),即i的階乘,這是模擬豎式乘法
for(
int k=
0;k<=len_b;k++
) c[j+k]
+=a[j]
*b[k]
;for
(int j=
0;j)//需要進製的就進製
if(c[j]
>
9) c[j+1]
+=c[j]/10
,c[j]%=
10;if(c[len_c]
) len_c++
;//看最高位要不要進製
len_ans=len_b,len_b=len_c,m=
max(m,len_c)
;//把len_b賦值給len_ans,修改len_b的值,m為i階乘的長度,看有沒有進製
for(
int k=len_c-
1;k>=
0;k--
) b[k]
=c[k]
;//把c存進b陣列,即存進i的階乘,下次迴圈b為i-1的階乘
len_c=len_a+len_ans;
memset
(c,0
,sizeof
(c))
;//清零c陣列,準備計算下個階乘
for(
int j=
0;jwhile
(!f[m]
&&m>
0) m--
;//去掉首導零
for(
int i=m;i>=
0;i--
) cout<
;//倒序輸出
return0;
//圓滿結束
}
emm 關於高精的事 高精加,高精乘,高精減
emm 這一篇主要是用來記錄所有的高精之類的東西的 高精加的難點就是演算法和倒置和去除前導0。直接上 include include includeint main 好的,就大概是這樣了,高精加的精髓在於演算法,一定要理解!高精減的難度就只有它的演算法是精髓,其他的跟高精乘差不多 include i...
高精乘 大數乘 詳解
高精乘就是兩個比較大的數字相乘,結果超過了基本型別的表示範圍,所以不能直接用普通的資料型別相乘,所以我們要用字串來表示,所以我們來用stl裡的string來表示字串.include using namespace std include define maxlen 100 string sum st...
高精度乘法入門詳解(高精乘高精)
高精度乘法。輸入兩個正整數,求它們的積。類似加法,可以用豎式求乘法。在做乘法運算時,同樣也有進製,同時對每一位進行乘法運算時,必須進行錯位相加,如圖3 圖4。分析c陣列下標的變化規律,可以寫出如下關係式 ci c i c i 由此可見,c i跟a i b j 乘積有關,跟上次的進製有關,還跟原c i...