技巧 高精度

2021-10-13 08:39:36 字數 3555 閱讀 4067

//高精度乘法

string mul

(string a,string b)

,nb[maxn]

=,nc[maxn]

=,la=a.

size()

,lb=b.

size()

;for

(int i=la-

1;i>=

0;i--

) na[la-i]

=a[i]

-'0'

;for

(int i=lb-

1;i>=

0;i--

) nb[lb-i]

=b[i]

-'0'

;for

(int i=

1;i<=la;i++

)for

(int j=

1;j<=lb;j++

) nc[i+j-1]

+=na[i]

*nb[j]

;for

(int i=

1;i<=la+lb;i++

) nc[i+1]

+=nc[i]/10

,nc[i]%=

10;if(nc[la+lb]

) s+

=nc[la+lb]

+'0'

;for

(int i=la+lb-

1;i>=

1;i--

) s+

=nc[i]

+'0'

;return s ==

string

(la+lb-1,

'0')

?"0"

: s;

}//高精度浮點數乘法

intmain()

if(it != s.

end(

)) s.

erase

(it)

;else status =1;

if(s[0]

=='0')if

(s.size()

==0)return0&

puts

("0");

string ans

("1");

for(

int i =

0; i < n;

++i) ans =

mul(ans, s)

;int zn =

(l -

1- dot)

* n;

if(status ==0)

else

if(status ==-1

)if(status !=1)

if(ans[ans.

size()

-1]==

'.') ans.

erase

(ans.

end()-

1); cout << ans << endl;

return0;

}//高精度加法

string add

(string a,string b)

//只限兩個非負整數相加

,nb[maxn]=;

int la=a.

size()

,lb=b.

size()

;for

(int i=

0;i) na[la-

1-i]

=a[i]

-'0'

;for

(int i=

0;i) nb[lb-

1-i]

=b[i]

-'0'

;int lmax=la>lb?la:lb;

for(

int i=

0;i) na[i]

+=nb[i]

,na[i+1]

+=na[i]/10

,na[i]%=

10;if(na[lmax]

) lmax++

;for

(int i=lmax-

1;i>=

0;i--

) ans+

=na[i]

+'0'

;return ans;

}//高精度減法

string sub

(string a,string b)

,nb[maxn]=;

int la=a.

size()

,lb=b.

size()

;for

(int i=

0;i) na[la-

1-i]

=a[i]

-'0'

;for

(int i=

0;i) nb[lb-

1-i]

=b[i]

-'0'

;int lmax=la>lb?la:lb;

for(

int i=

0;i)while

(!na[

--lmax]

&&lmax>0)

;lmax++

;for

(int i=lmax-

1;i>=

0;i--

) ans+

=na[i]

+'0'

;return ans;

}//高精度快速冪

string quickpow

(string a,

int k)

return res;

}//高精度max

string max

(string a, string b)

return a;

}int

main()

//正負以及加減合併

intmain()

else

if(b[0]

=='-'

)else cout <<

add(a, b)

<< endl;

return0;

}//高精度階乘

intmain()

//高精度快速階乘/大數乘小數

#include

using

namespace std;

typedef

long

long ll;

const ll l =

1e14

;ll ans[

10005]=

;int

main()

if(c !=

0) ans[

++p]

= c;

}printf

("%lld"

, ans[p]);

for(

int i = p -

1; i >=0;

--i)

printf

(i ==0?

"%0.14lld\n"

:"%0.14lld"

, ans[i]);

return0;

}//高精度極速階乘(不會,先放著)

高精度除法(高精度除以高精度)

先貼乙個簡單的高精度除以單精度的 include include include using namespace std int main else ys ys 10 a i 0 while c i 0 i for int j i j 0 j printf d c j if ys printf d ...

高精度除高精度

演算法流程 第一步,讀入被除數 a 和 除數 b,判斷是否 a b,是則輸出 0 並結束演算法,否則令 answer 0 第二步,令餘數 remainder 0,令 i 從被除數最高位的下標開始 第三步,令 remainder remainder 10 a i 令 c 9 第四步,判斷是否 b c ...

高精度除以高精度

原 題 高精除以高精,求它們的商和餘數。演算法分析 高精除以高精是用減法模擬除法,對被除數的每一位都減去除數,一直減到當前位置的數字 包括前面的餘數 小於除數 由於每一位的數字小於10,所以對於每一位最多進行10次計算 代 碼 include include include using namesp...