一本通1169 高精度减法
【题目描述】
求两个大的正整数相减的差。
【输入】
共2行,第1行是被减数a,第2行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导零。
【输出】
一行,即所求的差。
【输入样例】
9999999999999999999999999999999999999 9999999999999
【输出样例】
9999999999999999999999990000000000000
代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
using namespace std;
int main()
{
int a[256],b[256],c[256],lena,lenb,lenc,i;
char a1[256],a2[256],n[256];
gets(a1);
gets(a2);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
lena=strlen(a1);
lenb=strlen(a2);//前面步骤和加法一样,不再赘述
if(lena<lenb||(lena==lenb&&strcmp(a1,a2)<0))
{
strcpy(n,a1);
strcpy(a1,a2);
strcpy(a2,n);
cout<<"-";这几行代码的意思就是,如果被减数小于减数,那么两个数的值交换,并且输出一个负号
}
for(i=0;i<lena;i++)
{
a[lena-i]=a1[i]-48;
}
for(i=0;i<lenb;i++)
{
b[lenb-i]=a2[i]-48;
}//字符变成数字
i=1;
while(i<=lena||i<=lenb)//因为结果肯定小于其中的任意一个数,所以位数也要小于等于
{
if(a[i]<b[i])
{
a[i]+=10;
a[i+1]--;
}//如果对应的一位被减数比减数小,那么前面一位减1,本位加10,也就是借1当10
c[i]=a[i]-b[i];
i++;
}
lenc=i;
while((c[lenc]==0)&&(lenc>1))
lenc--;//如果有后缀0,就删掉
for(i=lenc;i>=1;i--)
cout<<c[i];
cout<<endl;
return 0;
}