高精度减法-给定两个正整数,计算它们的差,计算结果可能为负数。 输入格式 共两行,每行包含一个整数。 输出格式 共一行,包含所求的差。 数据范围 1≤整数长度≤1e5

Question:给定两个正整数,计算它们的差,计算结果可能为负数。

输入格式
共两行,每行包含一个整数。

输出格式
共一行,包含所求的差。

数据范围
1≤整数长度≤105
输入样例:
32
11
输出样例:
21
方法一:位数相同条件下比较字符串大小函数 自己定义

#include<iostream>
#include<cstring>
using namespace std;
const int N = 10000010;
char s1[N], s2[N],tmp[N];//为负数 则用tmp数组交换两个数组
int a[N], b[N], c[N];
bool cmp(int length)
{
    
    
    for(int i = 0; i <=length-1; i -- )
        if (s1[i] != s2[i])
            return s1[i] > s2[i];
    return true;
}
int main()
{
    
    
    cin >> s1>>s2;
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    if ((len1<len2) || (len1==len2 && cmp(len1)==0)) {
    
    
        //被减数小于减数,结果为负数
        printf("-");
        strcpy(tmp, s1);
        strcpy(s1, s2);
        strcpy(s2, tmp);
        //更新长度数据
        len1 = strlen(s1);
        len2 = strlen(s2);
    }
    for (int i = len1 - 1,j=0; i >= 0; i--,j++)
            a[j] = s1[i]-'0';
    for (int i = len2 - 1,j=0; i >= 0; i--,j++)
        b[j] = s2[i]-'0';
    for (int i=0; i<len1; i++) {
    
    
        if (a[i]<b[i]) {
    
    
            //有借位
            a[i+1]--;
            a[i] += 10;
        }
        c[i] = a[i] - b[i];
    }
    for (int i = len1 - 1; i >= 0; i--)
    {
    
    
        //因为我们是从索引 0 开始,所以最高位是保存在 len-1
        if (0 == c[i] && len1 > 1)
        {
    
    
            //注意要有 len1>1 这个条件。考虑特殊情况,加法结果为 00,我们实际要输出 0。
            len1--;
        }
        else
        {
    
    
            //第一个不是零的最高位,结束删除
            break;
        }
        }
    //逆序打印输出
    for (int i=len1-1; i>=0; i--) {
    
    
        printf("%d", c[i]);
    }
    printf("\n");
    return 0;

}

方法二:使用strcmp函数

#include<iostream>
#include<cstring>
using namespace std;
const int N = 10000010;
char s1[N], s2[N],tmp[N];//为负数 则用tmp数组交换两个数组
int a[N], b[N], c[N];
bool cmp(int length)
{
    
    
    for(int i = 0; i <=length-1; i -- )
        if (s1[i] != s2[i])
            return s1[i] > s2[i];
    return true;
}
int main()
{
    
    
    cin >> s1>>s2;
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    if ((lena<lenb) || (lena==lenb && strcmp(s1,s2)<0)){
    
    
        //被减数小于减数,结果为负数
        printf("-");
        strcpy(tmp, s1);
        strcpy(s1, s2);
        strcpy(s2, tmp);
        //更新长度数据
        len1 = strlen(s1);
        len2 = strlen(s2);
    }
    for (int i = len1 - 1,j=0; i >= 0; i--,j++)
            a[j] = s1[i]-'0';
    for (int i = len2 - 1,j=0; i >= 0; i--,j++)
        b[j] = s2[i]-'0';
    for (int i=0; i<len1; i++) {
    
    
        if (a[i]<b[i]) {
    
    
            //有借位
            a[i+1]--;
            a[i] += 10;
        }
        c[i] = a[i] - b[i];
    }
    for (int i = len1 - 1; i >= 0; i--)
    {
    
    
        //因为我们是从索引 0 开始,所以最高位是保存在 len-1
        if (0 == c[i] && len1 > 1)
        {
    
    
            //注意要有 len1>1 这个条件。考虑特殊情况,加法结果为 00,我们实际要输出 0。
            len1--;
        }
        else
        {
    
    
            //第一个不是零的最高位,结束删除
            break;
        }
        }
    //逆序打印输出
    for (int i=len1-1; i>=0; i--) {
    
    
        printf("%d", c[i]);
    }
    printf("\n");
    return 0;

}

猜你喜欢

转载自blog.csdn.net/weixin_46443659/article/details/109954559