其他分享
首页 > 其他分享> > AcWing 792. 高精度减法

AcWing 792. 高精度减法

作者:互联网

基础算法

AcWing 792. 高精度减法

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

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

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

数据范围
1 ≤ 整 数 长 度 ≤ 1 0 5 1≤整数长度≤10^5 1≤整数长度≤105

输入样例1:

32
11

输出样例1:

21

二、题解

c代码

#include <stdio.h>
#include <string.h>
#define N 100010

char s[N], s1[N], s2[N];

void reverse(char s[], int len) {  //将数组反过来,从低位开始减
    for (int i = 0; i < len; i++) s[i] -= '0';   //将'1'变成1
    int i = 0, j = len - 1;
    while(i < j) {
        char c = s[i];
        s[i] = s[j];
        s[j] = c;
        i++, j--;
    }
}

void subtract(char s[], char s1[], char s2[], int len) {
    int i = 0;
    while(i < len) {
        if(s1[i] < s2[i]) {    //不够减,借位
            s1[i] += 10;
            s1[i + 1]--;
        }
        s[i] = s1[i] - s2[i];
        i++;
    }
    
    while(!s[i]) i--;   //去掉多余的0,如1000-999=1,s中存储的是1000,多余三个0
    if(s[0] == 0) printf("0");   //1000-1000=0,s中为0000,避免把所有0都去掉
    else
        for (  ; i >= 0; i--)  printf("%d", s[i]);   //从高位往低位输出
    puts("");
}

int main() {
    scanf("%s%s", s1, s2);
    
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    int len = len1 >= len2 ? len1 : len2;
    
    int sign = 1;   //标志正负,1正0负
    if(len2 > len1)  sign = 0;   //判断s2大还是s1大,s2大答案为负
    else if(len1 == len2) {
        for (int i = 0; i < len; i++) { 
            if(s1[i] != s2[i]) {     //找到第一位不一样的,s1大就是正,s2大就是负
                if(s1[i] < s2[i]) { 
                    sign = 0;
                    break;
                }else break;
            }
        }
    }
    
    if(!sign)  printf("-");   //答案为负需要输出负号
    reverse(s1, len1);
    reverse(s2, len2);
    
    if(!sign)  subtract(s, s2, s1, len);   //s2大就拿s2减s1最后加个负号
    else  subtract(s, s1, s2, len);

    return 0;
}

标签:792,int,s2,s1,len,char,len2,减法,AcWing
来源: https://blog.csdn.net/weixin_45347199/article/details/118854701