zoukankan      html  css  js  c++  java
  • 大数四则运算之减法运算-----c语言版

    /*
    分三种情况:
    1.减数长度大于被减数
    交换减数与被减数,输出负号,方便减
    2.减数长度等于被减数(分三种情况)
    a.减数大于被减数,类似1情况1
    b.减数等于被减数,两数相等,直接输出0,完成。
    c.减数小于被减数
    3.减数长度小于被减数
    */
    
    #include<stdio.h>
    #include<string.h>
    int main() {
        char ch1[1000], ch2[1000];
        int num1[1000], num2[1000], num[1000];
        int i, j, flag1 = 1, max, flag2 = 0;
        scanf("%s", ch1);
        scanf("%s", ch2);
        max = strlen(ch1);
        if (strlen(ch1)<strlen(ch2)) {//减数长度大于被减数,必定为负数
            flag1 = -1;
            max = strlen(ch2);
            printf("-");
        }
        if (strlen(ch1) == strlen(ch2))
            flag1 = 0;//确定输入数字的长度比较结果。便于采用合理的运算方式
        for (i = 0; i<max; i++) {//初始化
            num[i] = 0;
            num1[i] = 0;
            num2[i] = 0;
        }
        for (i = strlen(ch1) - 1, j = 0; i >= 0; i--)
            num1[j++] = ch1[i] - '0';//将字符数组元素所对应数字存入整形数组
        for (i = strlen(ch2) - 1, j = 0; i >= 0; i--)
            num2[j++] = ch2[i] - '0';
        //分情况对数字进行减法运算
        if (flag1 == 1) {//第三种情况
            for (i = 0; i<strlen(ch1); i++) {
                num[i] = num1[i] - num2[i];
                if (num[i]<0) {
                    num[i] += 10;
                    num1[i + 1]--;
                }
            }
        }
        else if (flag1 == 0) {//第二种情况
            for (i = strlen(ch1) - 1; i <= 0; i--) {//循环结束的情况有两种 1.ch1[i]!=ch2[i] 2.遍历完数组中所有元素
                if (ch1[i] != ch2[i])
                    break;
            }
            if (ch1[i]>ch2[i]) {//ch1[i]>ch2[i],自然相减
                for (i = 0; i<strlen(ch1); i++) {
                    num[i] = num1[i] - num2[i];
                    if (num[i]<0) {
                        num[i] += 10;
                        num1[i + 1]--;
                    }
                }
            }
            else if (ch1[i] == ch2[i]) {//相等为0
                printf("0");
            }
            else {//输出负号,交换减数被减数
                printf("-");
                for (i = 0; i<strlen(ch1); i++) {
                    num[i] = num2[i] - num1[i];
                    if (num[i]<0) {
                        num[i] += 10;
                        num2[i + 1]--;
                    }
                }
            }
        }
    
        else {//第一种情况
            for (i = 0; i<strlen(ch2); i++) {
                num[i] = num2[i] - num1[i];
                if (num[i]<0) {
                    num[i] += 10;
                    num2[i + 1]--;
                }
            }
        }
        for (i = max; i >= 0; i--) {
            if (num[i] <= 0 && flag2 == 0)
                continue;
            flag2 = 1;
            printf("%d", num[i]);
        }
        return 0;
    
    }
  • 相关阅读:
    HDU5732 Subway【树重心 树哈希】
    HDU6311 Cover【欧拉路径 | 回路】
    HDU6370 Werewolf 【基环内向树】
    HDU6321 Dynamic Graph Matching【状压DP 子集枚举】
    HDU6331 Problem M. Walking Plan【Floyd + 矩阵 + 分块】
    HDU6403 Card Game【基环树 + 树形DP】
    HDU5691 Sitting in Line【状压DP】
    Codeforces Round #650 (Div. 3)
    2017-2018 ACM-ICPC, NEERC, Northern Subregional Contest
    Codeforces Round #649 (Div. 2)
  • 原文地址:https://www.cnblogs.com/lin0/p/6413113.html
Copyright © 2011-2022 走看看