首先聲明,沒有除法是因為我不會(手動狗頭_doge)
簡介
顧名思義,高精度算法是用來算一些超級大的數,比如長到 longlong 都存不下的那種,還有就是小數點后好多位,double都存不下的那種,今天我寫的是第一種——大數。
注意!!!不要輸入負數!!!
加
#include<bits/stdc++.h>
using namespace std;
string a;
string b;
string func(string,string);
int main()
{cin>>a>>b;cout<<func(a,b);return 0;
}
string func(string x,string y)
{int n[1000]={0};int m[1000]={0};int s[1000]={0};//1.把用戶輸入的數轉進一個個int,每個數位占一個空間//由于數組特性,還要把整個數字反轉過來,方便后續處理int la=x.size();int lb=y.size();for(int i=0;i<la;i++){n[la-1-i]=x[i]-48;}for(int i=0;i<lb;i++){m[lb-1-i]=y[i]-48;}//2.逐位相加,暫時不進位for(int i=0;i<max(la,lb);i++){s[i]=n[i]+m[i];}//3.進位for(int i=0;i<max(la,lb);i++){if(s[i]>=10){s[i+1]++;s[i]=s[i]-10;}}//4.在數組結尾處做標記,方便讀取int p=-1;for(int i=max(la,lb)+1;i>=0;i--){if(s[i]!=0){p=i;break;}}//5.讀取運算結果,轉入stringstring ss="";for(int i=0;i<=p;i++){ss=(char)(s[i]+48)+ss;}return ss;
}
減
(自動選取大數減去小數)
#include<bits/stdc++.h>
using namespace std;
string a;
string b;
string func(string,string);
int main()
{cin>>a>>b;cout<<func(a,b);return 0;
}
string func(string x,string y)
{//備注:f為true是m比n大,反之亦然//1.首先要反轉數組,再比出兩個數哪個大,因為負數不好處理//相等直接輸出0if(x==y)return 0;int n[10010]={0};int m[10010]={0};int s[10010]={0};//最終答案所在數組int ln=x.size();int lm=y.size();bool f=true;for(int i=0;i<ln;i++){n[ln-1-i]=x[i]-48;}for(int i=0;i<lm;i++){m[lm-1-i]=y[i]-48;}//比大小if(ln>lm){f=false;}else if(ln==lm&&x>y){f=false;}//2.分情況進行計算if(f==true){for(int i=0;i<lm;i++){s[i]=m[i]-n[i];}}else{for(int i=0;i<ln;i++){s[i]=n[i]-m[i];}}//3.退位for(int i=0;i<max(ln,lm);i++){if(s[i]<0){s[i+1]--;s[i]+=10;}}//4.在數組結尾處做標記,方便讀取int p=-1;for(int i=max(ln,lm)+1;i>=0;i--){if(s[i]!=0){p=i;break;}}//5.輸出結果string ss="";for(int i=0;i<=p;i++){ss=(char)(s[i]+48)+ss;}return ss;
}
乘
#include<bits/stdc++.h>
using namespace std;
string a;
string b;
string func(string,string);
int main()
{cin>>a>>b;cout<<func(a,b);return 0;
}
string func(string x,string y)
{int n[10010]={0};int m[10010]={0};int s[20020]={0};int ln=x.size();int lm=y.size();//1.反轉數字for(int i=0;i<ln;i++){n[ln-1-i]=x[i]-48;}for(int i=0;i<lm;i++){m[lm-1-i]=y[i]-48;}//2.逐位相乘,錯位相加for(int i=0;i<lm;i++){for(int j=0;j<ln;j++){s[i+j]+=m[i]*n[j];}}//3.進位for(int i=0;i<ln+lm;i++){s[i+1]+=s[i]/10;s[i]=s[i]%10;}//4.在數組結尾處做標記,方便讀取int p=-1;for(int i=ln+lm;i>=0;i--){if(s[i]!=0){p=i;break;}}//5.輸出結果string ss="";for(int i=0;i<=p;i++){ss=(char)(s[i]+48)+ss;}if(p==-1){return "0";}return ss;
}
加減乘混合
(輸入兩個數以后再次輸入一個數,1是加法,2是減法,3是乘法)
(別想了,輸入123以外的數會有提示)
#include<bits/stdc++.h>
#include<string.h>
#include<string>
using namespace std;
string a;
string b;
string funcjia(string,string);
string funcjian(string,string);
string funccheng(string,string);
int main()
{cin>>a>>b;int t;cin>>t;if(t==1){cout<<funcjia(a,b);}else if(t==2){cout<<funcjian(a,b);}else if(t==3){cout<<funccheng(a,b);}else{cout<<"Sorry,I can't find it.";}return 0;
}
string funcjia(string x,string y)
{int n[1000]={0};int m[1000]={0};int s[1000]={0};//1.把用戶輸入的數轉進一個個int,每個數位占一個空間//由于數組特性,還要把整個數字反轉過來,方便后續處理int ln=x.size();int lm=y.size();for(int i=0;i<ln;i++){n[ln-1-i]=x[i]-48;}for(int i=0;i<lm;i++){m[lm-1-i]=y[i]-48;}//2.逐位相加,暫時不進位for(int i=0;i<max(ln,lm);i++){s[i]=n[i]+m[i];}//3.進位for(int i=0;i<max(ln,lm);i++){if(s[i]>=10){s[i+1]++;s[i]=s[i]-10;}}//4.在數組結尾處做標記,方便讀取int p=-1;for(int i=max(ln,lm)+1;i>=0;i--){if(s[i]!=0){p=i;break;}}//5.讀取運算結果,轉入stringstring ss="";for(int i=0;i<=p;i++){ss=(char)(s[i]+48)+ss;}return ss;
}
string funcjian(string x,string y)
{//備注:f為true是m比n大,反之亦然//1.首先要反轉數組,再比出兩個數哪個大,因為負數不好處理//相等直接輸出0if(x==y)return 0;int n[10010]={0};int m[10010]={0};int s[10010]={0};//最終答案所在數組int ln=x.size();int lm=y.size();bool f=true;for(int i=0;i<ln;i++){n[ln-1-i]=x[i]-48;}for(int i=0;i<lm;i++){m[lm-1-i]=y[i]-48;}//比大小if(ln>lm){f=false;}else if(ln==lm&&x>y){f=false;}//2.分情況進行計算if(f==true){for(int i=0;i<lm;i++){s[i]=m[i]-n[i];}}else{for(int i=0;i<ln;i++){s[i]=n[i]-m[i];}}//3.退位for(int i=0;i<max(ln,lm);i++){if(s[i]<0){s[i+1]--;s[i]+=10;}}//4.在數組結尾處做標記,方便讀取int p=-1;for(int i=max(ln,lm)+1;i>=0;i--){if(s[i]!=0){p=i;break;}}//5.輸出結果string ss="";for(int i=0;i<=p;i++){ss=(char)(s[i]+48)+ss;}return ss;
}
string funccheng(string x,string y)
{int n[10010]={0};int m[10010]={0};int s[20020]={0};int ln=x.size();int lm=y.size();//1.反轉數字for(int i=0;i<ln;i++){n[ln-1-i]=x[i]-48;}for(int i=0;i<lm;i++){m[lm-1-i]=y[i]-48;}//2.逐位相乘,錯位相加for(int i=0;i<lm;i++){for(int j=0;j<ln;j++){s[i+j]+=m[i]*n[j];}}//3.進位for(int i=0;i<ln+lm;i++){s[i+1]+=s[i]/10;s[i]=s[i]%10;}//4.在數組結尾處做標記,方便讀取int p=-1;for(int i=ln+lm;i>=0;i--){if(s[i]!=0){p=i;break;}}//5.輸出結果string ss="";for(int i=0;i<=p;i++){ss=(char)(s[i]+48)+ss;}if(p==-1){return "0";}return ss;
}