高精度加减法,就是是你的程序能计算非常大的一些加减法。下面我们来了解一下这种加减法的实现过程.
加法:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
string a,b;
int m,n,maxn,f=0,i;
cin>>a>>b;//以字符串形式输入两个大到离谱的数
m=strlen(a);//定义字符串长度
n=strlen(b);
maxn=max(m,n);//找到数位更多的数保证能运行足够的次数
int as[max],bs[max],sum[max];
for(i=0;i<max;i++){
as[i]=0;//先清个零,不然不能保证所有数位被填满(在数位不同的情况下)
bs[i]=0;
}
for(i=0;i<m;i++){
as[i]=(int)(a[m-i-1]-'0');//反向存储每一位数字,把他们转化成int形式
}
for(i=0;i<n;i++){
bs[i]=(int)(b[n-i-1]-'0');
}
for(i=0;i<max;i++){
sum[i]=as[i]+bs[i]+f;//开始加,每一位的和=两个数这一位的和加上进位
f=sum[i]/10;//判断进位
sum[i]=sum[i]%10;//求出进位后的数位数字
}
if(f==1){
cout<<f;//要是首位进位的话就先输出首位进位
}
for(i=max-1;i>=0;i--){
cout<<sum[i];//输出
}
}
减法和加法差不多,只是进位变为退位
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
char n1[9999],n2[9999],n3[9999];
int z[99][99]={0};
int s1[9999]={0},s2[9999]={0},s3[9999]={0};
int main()
{
int i=0,l,nx,ny,tw=0,ti=0,ti2=0;
cin>>n1>>n2;
nx=strlen(n1);
ny=strlen(n2);
int y=max(nx,ny);
if(nx<ny||(strcmp(n1,n2)<0&&nx==ny))//处理负数问题
{
strcpy(n3,n1);
strcpy(n1,n2);
strcpy(n2,n3);//换位
swap(nx,ny);
cout<<"-";//输出负号
}
for(i=0;i<nx;i++)
{
s1[i]=n1[nx-1-i]-'0';//倒序输入一个数
}
for(i=0;i<ny;i++)
{
s2[i]=n2[ny-1-i]-'0';//另一个数
}
for(i=0;i<y;i++)
{
s1[i]=s1[i]-s2[i];
if(s1[i]<0)
{
s1[i]+=10;
s1[i+1]--;//退位处理
}
}
i=y-1;//x新的输出方法,可以省略前面的0.
while(s1[i]==0) i--;
for(;i>=0;i--) cout<<s1[i];
}