首先声明,没有除法是因为我不会(手动狗头_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;
}