python高精度乘法 高精度運算

2021-10-11 17:11:51 字數 2329 閱讀 3427

今天模擬,很巧的是我前兩天剛看過這個qwq

某人為數不多的寫了blog的題解

我麻了,這個人怎麼會是我**

高精度運算需要使用python

因為在十進位制,int最多十位,long long最多十九位,

要算比這個還大的數,就要把它拆成一位一位,模擬列豎式計算,也就是高精度

輸入和輸出

chars1[maxn],s2[maxn];int d1[maxn],d2[maxn];

首先把兩個數以字串的形式讀入,然後把它們轉化成int;

for(int i = 0; i <= len1; i++) d1[len1-i] = s1[i]-'0';

(這麼寫的好處是,陣列的下標由原來的0~len-1變成了1~len)

計算;最後倒序輸出,忽略前導0。只剩一位的時候0要保留。

while(k>1) for(int i = k; i; i--) printf("%d",ans[i]);

高精度加法

計算時,注意判斷是否進製。加法最多只能進一位,所以$ans[i+1]+1,ans[i]-10$即可。

#include#include#include#include#include#include

#define mogeko qwq

using namespacestd;const int maxn = 1e6+10;chars1[maxn],s2[maxn];intlen1,len2,k;intd1[maxn],d2[maxn],ans[maxn];intmain() while(k>1) for(int i = k; i; i--)printf("%d",ans[i]);return 0;

高精度減法

同理,只能借一位,$ans[i+1]-1,ans[i]+10$。

注意:需要先判斷答案的正負,先比較兩個數字的位數,再一位一位比較,

如果前面的較小,則交換兩個陣列並輸出負號。相等則按正數算。

#include#include#include#include#include#include

#define mogeko qwq

using namespacestd;const int maxn = 1e6+10;chars1[maxn],s2[maxn];intlen1,len2,k;intd1[maxn],d2[maxn],ans[maxn];boolcheck() return true;

}intmain() while(++k <=max(len1,len2)) while(k>1) for(int i = k; i; i--)printf("%d",ans[i]);return 0;

高精度乘法

設第乙個數枚舉到$d[i]$,第二個數枚舉到$d[j]$,則當前算出來的的數字為$ans[i+j-1]$。

可能進不止一位,則$ans[i+1]+ans[i]/10,ans[i] mod 10$。

注意資料範圍,陣列的大小應為$n^2$

#include#include#include#include#include#include

#define mogeko qwq

using namespacestd;const int maxn = 1e6+10;chars1[maxn],s2[maxn];intlen1,len2,k;intd1[maxn],d2[maxn],ans[maxn];intmain() for(int i = k; i; i--)printf("%d",ans[i]);return 0;

高精度階乘

當要求乙個較大數的階乘時,需要應用到高精度乘法。

$n! = n*(n-1)!$,

用當前列舉到的數$n$與已經得到的數$(n-1)!$的各個數字相乘,即低精度*高精度。

注意這裡不能直接$ans[i+1]+ans[i]/10$。因為$ans[i+1]$下一步還要與$n$相乘,乘法的優先順序高於加法的優先順序。

可以用乙個$tem$記錄進製,$ans[i+1]$完成乘法操作後再加上$tem$。

注意,列舉答案的每一位時,每次記錄答案現在的位數比較麻煩,可以每次列舉到可能的最大值。

估算n的階乘位數可以用斯特林公式……emm還是算了吧。

(100!約有158位,1000!約有2568位,10000!約有35660位)

#include#include#include#include#include#include

#define mogeko qwq

using namespacestd;const int maxn = 1e6+10;intn,k,t;intans[maxn];intmain() while(k>1) for(int i = k; i; i--)printf("%d",ans[i]);return 0;

(然而並不會寫除法)

高精度減法,高精度乘法

高精度減法 oj資料偏弱如果新增乙個101 2就錯了,下面這一步是為了防止錯誤的 if a aa 0 可能出現第一位的1被借走的的情況,所以加乙個while找第乙個不是0的 while c i 0 i include include include include include include u...

演算法 高精度乘法2(高精度乘高精度)

題目描述 高精度乘,求兩個很大的非負整數相乘的結果。輸入 2個非負整數,每個一行,每個整數不超過240位。輸出 乙個整數,表示相乘的結果。例子 為了和演算法對應方便,用上面數乘下面數的方法12 5 2512 5502 5312 5為了運算方便,將上面兩數倒置,得到的結果也為倒序下標0 1234 56...

高精度加法和高精度乘法

題目描述 谷學長有乙個非常簡單的問題給你,給你兩個整數a和b,你的任務是計算a b。輸入 輸入的第一行包含乙個整數t t 20 表示測試例項的個數,然後2 t行,分別表示a和b兩個正整數。注意整數非常大,那意味著你不能用32位整數來處理。你可以確定的是整數的長度不超過1000。輸出 對於每乙個樣例,...