【9110】高精度减法

Time Limit: 1 second
Memory Limit: 2 MB

问题描述

输入两个正整数x和y,输出第一个数减第二个数的差。
    
 

Input

输入只有两行,第一行一个整数x,第二行一个整数y。其中0<=x<=10^160,0<=y<=10^160

Output

输出有1行,为两个数的差。

Sample Input

222222222233333333333333333333
222222222222222222222222222222

Sample Output

11111111111111111111(换行)
 

【题解】

将x和y都逆序存进去。用一个c数组直接等于两个数相减。for (1 -> 较长的长度) c[i] = a[i]-b[i];

然后for (1 ->较长的长度)

if (c[i] <0) c[i] +=10;

c[i+1]--;

然后去除多余的0;

【代码】

#include <cstdio>
#include <iostream>
#include <string>

using namespace std;

string s1,s2,s3;
int l1,l2,l3,a[200],b[200],c[200];

void input_data() //要判断一下 s1和s2的大小
{
    cin >> s1;
    cin >> s2;
    l1 = s1.size();
    l2 = s2.size();
    bool bo = false;
    if (l1 < l2) bo = true;
    if (l1 == l2) //如果长度相等 再比较第一个不同的数字 然后判断是否要调换顺序 即确定s1-s2,然后再输出一个负号
        for (int i = 0;i <= l1-1;i++)
            if (s1[i] == s2[i])
                continue;
                    else
                        if (s1[i] < s2[i])
                            bo = true;
                                else
                                    break;
    if (bo)
        {
            printf("-");
            s3 = s1;s1 = s2;s2 = s3;
            l1 = s1.size();
            l2 = s2.size();
        }
    for (int i = 1;i <= 199;i++)
        c[i] = 0,a[i] = 0,b[i] = 0;
    for (int i = 1;i <= l1;i++) //把a,b数组表示出来 (逆序)
        a[i] = s1[l1-i] - '0';
    for (int i = 1;i <= l2;i++)
        b[i] = s2[l2-i] - '0';
}

void get_ans()
{
    for (int i = 1;i <= l1;i++) //等于两个数相减
        c[i] = a[i] - b[i];
    for (int i = 1;i <= l1;i++)
        if (c[i] < 0)
            c[i] += 10,c[i+1]--;
    while (c[l1] == 0 && l1 > 1)
        l1--;
}

void output_ans()
{
    for (int i = l1;i >=1;i--)
        printf("%d",c[i]);
}

int main()
{
    input_data();
    get_ans();
    output_ans();
    return 0;
}


 

原文地址:https://www.cnblogs.com/AWCXV/p/7632438.html