高精度运算模板(大数模板)
生活随笔
收集整理的這篇文章主要介紹了
高精度运算模板(大数模板)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
現(xiàn)在還沒學(xué)java。。所以沒法用java偷懶,先存一波C加加的大數(shù)運(yùn)算模板,以備不時之需
補(bǔ)充:關(guān)于base參數(shù)的使用:代表字符串a(chǎn)和b都是在base進(jìn)制下的數(shù)字,轉(zhuǎn)換成10進(jìn)制后進(jìn)行運(yùn)算后,返回的答案為base進(jìn)制,默認(rèn)為10進(jìn)制,進(jìn)制可以隨意設(shè)置,用字符串ss和數(shù)組mp互相映射,使用之前用init函數(shù)初始化一下mp數(shù)組即可
一、兩個正數(shù)的加法:
使用方法:輸入完string a和string b后,調(diào)用plu函數(shù)進(jìn)行加操作即可
const int N=4500;//最大長度const string ss="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";int mp[150]; void postpoint(string& a)//移位處理 {int len=a.size();a.resize(N);for(int i=0;i<len;i++){a[N-i-1]=a[len-i-1];a[len-i-1]=0;} }string change(const string& a)//用于解除postpoint {string ans;for(int i=0;i<N;i++)if(a[i])ans+=a[i];return ans; }string plu(string a,string b,int base=10) {postpoint(a);postpoint(b);string temp;temp.resize(N);int f=0;for(int i=N-1;a[i]||b[i]||f;i--){a[i]==0?a[i]='0':0;b[i]==0?b[i]='0':0;temp[i]=(mp[a[i]]+mp[b[i]]+f)%base;f=(mp[a[i]]+mp[b[i]]+f)/base;temp[i]=ss[temp[i]];}return change(temp); }void init() {for(int i=0;i<ss.size();i++)mp[ss[i]]=i; }二、兩個正數(shù)的乘法:
使用方法:和上述加法操作相似,只是將調(diào)用plus函數(shù)改成調(diào)用mulmax函數(shù)即可
const int N=4500;//最大長度const string ss="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";int mp[150]; void postpoint(string& a)//移位處理 {int len=a.size();a.resize(N);for(int i=0;i<len;i++){a[N-i-1]=a[len-i-1];a[len-i-1]=0;} }string change(const string& a)//用于解除postpoint {string ans;for(int i=0;i<N;i++)if(a[i])ans+=a[i];return ans; }string plu(string a,string b,int base=10) {postpoint(a);postpoint(b);string temp;temp.resize(N);int f=0;for(int i=N-1;a[i]||b[i]||f;i--){a[i]==0?a[i]='0':0;b[i]==0?b[i]='0':0;temp[i]=(mp[a[i]]+mp[b[i]]+f)%base;f=(mp[a[i]]+mp[b[i]]+f)/base;temp[i]=ss[temp[i]];}return change(temp); }string mul(string a,long long n,int base=10) {postpoint(a);string temp;temp.resize(N);int f=0;for(int i=N-1;a[i]||f;i--){a[i]==0?a[i]='0':0;temp[i]=(mp[a[i]]*n+f)%base;f=(mp[a[i]]*n+f)/base;temp[i]=ss[temp[i]];}return change(temp); }string mulmax(string a,string b,int lenb,int base=10) {string temp;temp.resize(N);for(int i=0;i<lenb;i++){string tem=mul(a,mp[b[i]],base);temp=mul(temp,base,base);temp=plu(temp,tem,base);}return temp; }void init() {for(int i=0;i<ss.size();i++)mp[ss[i]]=i; }三、兩個正數(shù)的減法:
使用方法:直接調(diào)用函數(shù)即可,參數(shù)為兩個相減的數(shù):a-b,base為進(jìn)制
參考博客:https://blog.csdn.net/ACMer_QJ/article/details/80118152
const int N=4500;//最大長度const string ss="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";int mp[150]; string sub(string a, string b,int base=10) {int i,j,k,s;string tmpa,tmpb,c,ans;tmpa.resize(N);tmpb.resize(N);c.resize(N);if(a.size()<b.size()||a.size()==b.size()&&a<b) {swap(a,b);ans+='-';}while(a.length()>b.length()) b='0'+b;int len=a.length();for(i=0;i<len;i++) {tmpa[i]=mp[a[i]];tmpb[i]=mp[b[i]];}for(i=len-1;i>=0;i--) {if (tmpa[i]>=tmpb[i]) c[i]=tmpa[i]-tmpb[i];else {c[i]=base+tmpa[i]-tmpb[i];tmpa[i-1]--;}}for(i=0;i<len-1;i++) if(c[i]!=0) break;for(j=i;j<len;j++) ans+=ss[c[j]];return ans; }void init() {for(int i=0;i<ss.size();i++)mp[ss[i]]=i; }四、正數(shù)除整數(shù)的除法:
使用方法:直接調(diào)用即可,兩個參數(shù)分別為一個正數(shù)和一個整數(shù)
參考博客:https://blog.csdn.net/u012860063/article/details/36903491
const int N=4500;//最大長度const string ss="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";int mp[150]; string Except(string s,long long x,int base=10) //大數(shù)除以整形數(shù) {long long cmp=0;bool ok=false;string ans="";for(int i=0;i<s.size();i++){cmp=(cmp*base+mp[s[i]]);if(cmp>=x){ok=true;ans+=ss[cmp/x];cmp%=x;}else{if(ok)ans+='0'; //注意這里}}if(ans.empty())return "0";return ans; }void init() {for(int i=0;i<ss.size();i++)mp[ss[i]]=i; }五、正整數(shù)乘法取余:
使用方法:直接調(diào)用上面涉及到的函數(shù)即可
long long remain(string s,long long mod,int base=10) {long long ans=0;for(int i=0;i<s.size();i++)ans=(ans*10+mp[s[i]])%mod;return ans; }?
總結(jié)
以上是生活随笔為你收集整理的高精度运算模板(大数模板)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HihoCoder - 1828 Sav
- 下一篇: 2018宁夏邀请赛 - Copy and