今天模擬,很巧的是我前兩天剛看過這個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。輸出 對於每乙個樣例,...