ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AcWing 792. 高精度减法

2021-07-17 12:33:43  阅读:180  来源: 互联网

标签:792 int s2 s1 len char len2 减法 AcWing


基础算法

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有