大整数1000位包括正负数的加减运算

代码如下

#include <stdio.h>
#include <string.h>
#include <math.h>
void printf_arr(int* arr) { // 输出数组的值
    for (int i = arr[0]; i > 0; i--) {
        printf("%d", arr[i]);
    }
    printf("\n");
    return;
}
int big_add(int* a, int* b, int* ans_ab) {
    ans_ab[0] = a[0] > b[0] ? a[0] : b[0]; // 和的长度
    int min = a[0] <b[0] ? a[0] : b[0];
    for (int i = 1; i <= ans_ab[0]; i++) {
        if(i<=min) ans_ab[i] = a[i] + b[i]; // 加法运算
        if (i > min && a[0] == min) ans_ab[i] = b[i];
        if (i > min && b[0] == min) ans_ab[i] = a[i];
    }
    for (int i = 1; i <= ans_ab[0]; i++) { // 处理进位
        if (ans_ab[i] > 9) 
        {
            ans_ab[i + 1] += ans_ab[i] / 10;//进几个十
            ans_ab[i] %= 10;//剩下的个位数字
            if (i == ans_ab[0]) ans_ab[0]++; // 最高位大于9,长度+1
        }
    }
    return 1;
}

void jiafa(int n1[], int n2[])
{
    int ans[1005] = { 0 };
    //2、 算法计算-------------------
    big_add(n1, n2, ans);
    printf_arr(ans);
}
// 交换两个数组
void swap_arr(int* n1, int* n2) {
    int max_len = n1[0] > n2[0] ? n1[0] : n2[0];
    int temp;
    for (int i = 0; i <= max_len; i++) {
        temp = n2[i];
        n2[i] = n1[i];
        n1[i] = temp;
    }
    return;
}
// 计算大整数减法 n1 - n2
int jianfa(int n1[], int n2[]) {
    int ans[1005] = { 0 };
    int flag = 1; // 如果 n1 > n2 即 flag = 1
    if (n1[0] < n2[0]) flag = 0;
    if (n1[0] == n2[0]) {//位数相同的话
        int i = n1[0],k=n1[0];
        while (i > 0) {
            if (n1[i] == n2[i]) i--,k--;
            if (n1[i] > n2[i]) i = 0; // 要考虑每位都大的情况
            if (n1[i] < n2[i]) {
                flag = 0;
                break;
            }
        }
        if (i == 0&&k==0) {
            printf("%d\n", 0); // 位数相等,每一位也相等,差值为0
            return 0;
        }
    }
    if (flag == 0) swap_arr(n1, n2); // n1 < n2  交换相减
    for (int i = 1; i <= n1[0]; i++) {
        if (n1[i] < n2[i]) {
            n1[i] += 10;
            n1[i + 1] -= 1;
        }
        if (n1[i] >= 0 && n2[i] >= 0) ans[i] = n1[i] - n2[i];
        if (n1[i] >= 0 && n2[i] == -3) ans[i] = n1[i] - 0;
    }

    if (flag == 0) printf("-");
    int flag_0 = 0;  // 判断当前的0是否要输出,如果之前输出过正整数,则当前的0需要输出
    for (int i = n1[0]; i > 0; i--) {
        if (ans[i]) printf("%d", ans[i]), flag_0 = 1;
        if (ans[i] == 0 && flag_0 == 1) printf("%d", 0);
    }

 

 

 

 

思路借鉴于

我用#CSDN#这个app发现了有技术含量的博客,小伙伴们求同去《大整数(1000位)的加减乘除运算》, 一起来围观吧 https://blog.csdn.net/wu496963386/article/details/121793548?utm_source=app&app_version=5.2.1&code=app_1562916241&uLinkId=usr1mkqgl919blen

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值