首先声明,没有除法是因为我不会(手动狗头_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.读取运算结果,转入string
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)
{
//备注:f为true是m比n大,反之亦然
//1.首先要反转数组,再比出两个数哪个大,因为负数不好处理
//相等直接输出0
if(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.读取运算结果,转入string
string 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.首先要反转数组,再比出两个数哪个大,因为负数不好处理
//相等直接输出0
if(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;
}