两个大整数减法


代码演示

#include <stdio.h>
#include <string.h>

char s1[1005], s2[1005]; //全局定义初始化为0或者'\0' 
int n1[1005], n2[1005], ans[1006];

int flag; //a1大, flag = 1; 否则为0;  

int strcmp_(char *a1, char *a2) {//a1大, 返回1; a2大返回0,相等返回-1; 
    int a1_len =  strlen(a1), a2_len = strlen(a2);
    if (a1_len == a2_len) {
        for (int i = 0; a1[i]; i++) {
            if (a1[i] > a2[i]) return 1; 
            else if (a1[i] < a2[i]) return 0;
        }
        return -1;
    } else if (a1_len > a2_len) return 1;
    return 0;
    
}

void big_sub(int *a1, int *a2) { //设定a1比a2大 
    for (int i = 1; i <= ans[0]; i++) {
        ans[i] = a1[i] - a2[i];
    }
    for (int i = 1; i <= ans[0]; i++) {
        if (ans[i] < 0) {
            --ans[i + 1];
            ans[i] += 10;
        }
    }
    while (ans[ans[0]] == 0) ans[0]--; //去除前导0 
    return ;
}

int main() {
    // s1 - s2
    scanf("%s", s1);
    scanf("%s", s2);
    n1[0] = strlen(s1);
    n2[0] = strlen(s2);
    flag = strcmp_(s1, s2);
    if (flag == -1) {
        printf("0\n");
        return 0;
    }  
    //数据倒序存储
    for (int i = 0, j = n1[0]; j && s1[i]; j--, i++) {
        n1[j] = s1[i] - '0';
    } 
    for (int i = 0, j = n2[0]; j && s2[i]; j--, i++) {
        n2[j] = s2[i] - '0';
    }     
    
    if (flag) {
        ans[0] = n1[0];
        big_sub(n1, n2);
    } else {
        ans[0] = n2[0], big_sub(n2, n1);
        printf("-");
    }
    for (int i = ans[0]; i; i--) {
        printf("%d", ans[i]);
    }
    
    return 0;
}

文章作者: Axieyun
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Axieyun !
评论
评论
  目录