时间限制: 1000 ms 内存限制: 65536 KB
提交数: 3224 通过数: 1800
【题目描述】
求两个大的正整数相减的差。
【输入】
共2行,第1行是被减数a,第2行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导零。
【输出】
一行,即所求的差。
【输入样例】
9999999999999999999999999999999999999
9999999999999
【输出样例】
9999999999999999999999990000000000000
【来源】
NO
【代码】
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main ()
{
int a[205],b[205],c[205],la,lb,lc,x=0;
char a1[2000],b1[2000];
gets(a1);
gets(b1);
la=strlen(a1);
lb=strlen(b1);
for(int i=0;i<=la-1;i++) //被减数
{
a[la-i]=a1[i]-'0';
}
for (int j=0;j<=lb-1;j++) //减数
{
b[lb-j]=b1[j]-'0';
}
for(int m=lb+1;m<=la;m++) //将减数数组b补0补足位
{
b[m]=0;
}
lc=1;
while(lc<=la) //进行借位减法运算
{
c[lc]=a[lc]-b[lc]-x;
if(c[lc]<0)
{
x=1;
c[lc]+=10;
}
else
{
x=0;
}
lc++;
}
while(c[lc-1]==0) //删掉多余的前导0
{
lc--;
}
for(int k=lc-1;k>=1;k--) //因为前面进行倒序相加,注意进行倒序输出
{
cout<<c[k];
}
return 0;
}
【解题思路】
难点:补位理解、借位相减
1.与大整数加法相似,大整数减法也要从最右边开始进行减法运算,所以也要进行倒序。
for(int i=0;i<=la-1;i++) //被减数
{8
a[la-i]=a1[i]-'0';
}
2.与大整数加法不同,这时候要将减数与被减数区分开来;建立三个数组a,b,c,a代表被减数,b代表减数,c代表差数;a一定比b长,又因为是减法,要注意将b补0补到与a一样长。
for(int m=lb+1;m<=la;m++) //将减数数组b补0补足位
{
b[m]=0;
}
3.与大整数加法相似,设置一个变量借位值x的初始值x=0;当被减数不够减时,也就是a[lc]-b[lc]-x小于0时,向前面借一位,如何借?将x变成1就可以了,否则x=0;借位之后当前位就加上10,也就是c[lc]+=10。
while(lc<=la) //进行借位减法运算
{
c[lc]=a[lc]-b[lc]-x;
if(c[lc]<0)
{
x=1;
c[lc]+=10;
}
else
{
x=0;
}
lc++;
}