1169:大整数减法

时间限制: 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++;
    }

猜你喜欢

转载自blog.csdn.net/ice___snow/article/details/81571050