1169:大整数减法
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 33396 通过数: 19032
【题目描述】
求两个大的正整数相减的差。
【输入】
共2行,第1行是被减数a,第2行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导零。
【输出】
一行,即所求的差。
【输入样例】
9999999999999999999999999999999999999
9999999999999
【输出样例】
9999999999999999999999990000000000000
【思路】
类似加法,可以用竖式求减法。在做减法运算时,需要注意的是:被减数必须比减数大,同时需要处理借位。
减法借位:if (a[i]<b[i]) { a[i+1]–; a[i]+=10; }
c[i]=a[i]-b[i];
【源代码】
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char n1[201],n2[201],n[201];
int a[201]={},b[201]={},c[201]={},x,lena,lenb,lenc;
scanf("%s%s",n1,n2);//输入被减数和减数
lena=strlen(n1);
lenb=strlen(n2);
if((lena<lenb)||(lena==lenb&&strcmp(n1,n2)<0))
{ //处理减数和被减数,交换被减数和减数
strcpy(n,n1);
strcpy(n1,n2);
strcpy(n2,n);
cout<<"-";//交换了减数和被减数,结果为负数
}
for(int i=0;i<lena;i++) a[lena-i]=n1[i]-'0';
for(int i=0;i<lenb;i++) b[lenb-i]=n2[i]-'0';
x=1;
while((x<=lena)||(x<=lenb))
{
if(a[x]<b[x])
{
a[x]+=10;//不够减向高位借1当10
a[x+1]--;
}
c[x]=a[x]-b[x];//对应位相减
x++;
}
lenc=x;
while((c[lenc]==0)&&(lenc>1)) lenc--;//最高位的0不输出,删除前导0
for(int i=lenc;i>=1;i--) cout<<c[i];
return 0;
}