C语言大整数运算

大整数运算是指对于超过计算机数据类型范围的数进行运算的一种方法。在C语言中,通常使用数组来存储大整数,并通过编写相应的函数实现加、减、乘、除等运算。
在进行大整数运算时,需要注意以下几点:
数组长度要足够长,以存储所需的位数。例如,如果需要计算1000位的数字,则数组长度至少要为1000。

进行加减法时,需要考虑进位和借位的情况。可以通过循环遍历数组,并使用一个变量来记录进位或借位。

加法

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

#define MAX_LEN 1000

void add(char *a, char *b, char *res) {
    int carry = 0;
    int len_a = strlen(a);
    int len_b = strlen(b);
    int i = len_a - 1;
    int j = len_b - 1;
    int k = MAX_LEN - 1; // 初始化res的index为最大长度 - 1

    // 初始化res为全0
    memset(res, '0', MAX_LEN);

    res[k--] = '\0'; // 以空字符终止res字符串

    while (i >= 0 || j >= 0 || carry) {
        int sum = carry;
        if (i >= 0) {
            sum += a[i--] - '0';
        }
        if (j >= 0) {
            sum += b[j--] - '0';
        }
        res[k--] = sum % 10 + '0';
        carry = sum / 10;
    }

    // 移除前导零
    for (i = 0; i < MAX_LEN - 1; ++i) {
        if (res[i] != '0') {
            break;
        }
    }
    if (i > 0) {
        memmove(res, res + i, MAX_LEN - i);
    }
}

int main() {
    char a[MAX_LEN], b[MAX_LEN], res[MAX_LEN + 1]; // 额外+1是为了可能的进位

    printf("请输入两个大整数:\n");
    scanf("%s%s", a, b);

    add(a, b, res);

    printf("结果为:%s\n", res);

    return 0;
}

在上面的代码中,我们定义了一个add()函数,该函数接受两个大整数a和b,并将它们相加后存储到结果数组res中。具体实现过程如下:
定义一个进位变量carry,初值为0。分别获取两个大整数的长度。从最低位开始遍历两个大整数,依次相加,并将结果存储到结果数组中。同时更新进位变量。

减法

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

#define MAX_LEN 1000

void sub(char *a, char *b, char *res) {
    int borrow = 0;
    int len_a = strlen(a);
    int len_b = strlen(b);
    int i, j;
    
    for (i = len_a - 1, j = len_b - 1; i >= 0 || j >= 0; i--, j--) {
        int diff = borrow;
        if (i >= 0) {
            diff += a[i] - '0';
        }
        if (j >= 0) {
            diff -= b[j] - '0';
        }
        if (diff < 0) {
            diff += 10;
            borrow = -1;
        } else {
            borrow = 0;
        }
        res[i] = diff + '0';
    }
    
    while (*res == '0' && *(res + 1) != '\0') {
        res++;
    }
}

int main() {
    char a[MAX_LEN], b[MAX_LEN], res[MAX_LEN];
    
    printf("请输入两个大整数:\n");
    scanf("%s%s", a, b);
    
    sub(a, b, res);
    
    printf("结果为:%s\n", res);
    
    return 0;
}

在上面的代码中,我们定义了一个sub()函数,该函数接受两个大整数a和b,并将它们相减后存储到结果数组res中。具体实现过程如下:定义一个借位变量borrow,初值为0。分别获取两个大整数的长度。从最低位开始遍历两个大整数,依次相减,并将结果存储到结果数组中。

进行乘法时,可以采用竖式计算的方法。即将两个大整数分别拆分成若干个小数字相乘,并将结果累加起来。

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

#define MAX_LEN 1000

void multiply(char num1[], char num2[], char result[]) {
    int len1 = strlen(num1);
    int len2 = strlen(num2);
    int i, j, k;

    // 初始化结果数组为0
    int res[MAX_LEN] = {0};

    // 逐位相乘并累加
    for (i = len1 - 1; i >= 0; i--) {
        for (j = len2 - 1; j >= 0; j--) {
            k = len1 + len2 - i - j - 2;
            res[k] += (num1[i] - '0') * (num2[j] - '0');
            res[k + 1] += res[k] / 10;
            res[k] %= 10;
        }
    }

    // 将结果转换成字符串形式
    int pos = MAX_LEN - 1;
    while (pos > 0 && res[pos] == 0) pos--;
    for (i = pos, j = 0; i >= 0; i--, j++) {
        result[j] = res[i] + '0';
    }
    result[j] = '\0';
}

int main() {
    char num1[MAX_LEN], num2[MAX_LEN], result[MAX_LEN];
    
    printf("请输入第一个大整数:");
    scanf("%s", num1);

    printf("请输入第二个大整数:");
    scanf("%s", num2);

    multiply(num1, num2, result);
    printf("结果为:%s\n", result);

    return 0;
}


进行除法时,可以采用长除法的方法。即从高位开始逐步计算商和余数,并将结果存储到对应的数组中。

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

#define MAX_LEN 1000

int compare(char num1[], char num2[]) {
    int len1 = strlen(num1);
    int len2 = strlen(num2);
    if (len1 > len2) return 1;
    if (len1 < len2) return -1;
    for (int i = 0; i < len1; i++) {
        if (num1[i] > num2[i]) return 1;
        if (num1[i] < num2[i]) return -1;
    }
    return 0;
}

void divide(char num[], char divisor[], char result[]) {
    int len = strlen(num);
    int divisor_len = strlen(divisor);

    // 将被除数和除数转换成数字形式
    int dividend[MAX_LEN], div[MAX_LEN];
    for (int i = 0; i < len; i++) {
        dividend[i] = num[len - i - 1] - '0';
    }
    for (int i = 0; i < divisor_len; i++) {
        div[i] = divisor[divisor_len - i - 1] - '0';
    }

    // 计算商和余数
    int quotient[MAX_LEN], remainder[MAX_LEN];
    memset(quotient, 0, sizeof(quotient));
    memset(remainder, 0, sizeof(remainder));
    
    for (int k = len - divisor_len; k >= 0; k--) {
        remainder[k + divisor_len] = dividend[k + divisor_len];
        while (compare(remainder + k, div) >= 0) {
            quotient[k]++;
            for (int i = 0; i < divisor_len; i++) {
                remainder[k + i] -= div[i];
                if (remainder[k + i] < 0) {
                    remainder[k + i] += 10;
                    remainder[k + i + 1]--;
                }
            }
        }
    }

    // 将结果转换成字符串形式


总之,在进行大整数运算时需要注意细节,并且需要编写相应的函数来实现各种运算。同时还需要注意性能问题,尽可能优化代码以提高程序效率。

  • 4
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
下面是C语言实现的长整数加法和乘法运算代码: ```c #include<stdio.h> #include<string.h> // 定义最大位数,一般为10的整数次幂 #define MAX_LEN 1000 // 长整数结构体 struct bigInt { int digit[MAX_LEN]; // 存储每一位的值 int size; // 当前位数 }; // 初始化长整数 void init(struct bigInt *a) { memset(a->digit, 0, sizeof(a->digit)); a->size = 0; } // 将字符串转换为长整数 void strToInt(struct bigInt *a, char str[]) { init(a); int len = strlen(str); for(int i = len - 1, j = 0, t = 0, c = 1; i >= 0; i--) { t += (str[i] - '0') * c; j++; c *= 10; if(j == 4 || i == 0) { // 每四位处理一次 a->digit[a->size++] = t; j = 0; t = 0; c = 1; } } } // 比较两个长整数的大小,a > b 返回 1,a == b 返回 0,a < b 返回 -1 int compare(struct bigInt a, struct bigInt b) { if(a.size > b.size) return 1; if(a.size < b.size) return -1; for(int i = a.size - 1; i >= 0; i--) { if(a.digit[i] > b.digit[i]) return 1; if(a.digit[i] < b.digit[i]) return -1; } return 0; } // 长整数加法 struct bigInt add(struct bigInt a, struct bigInt b) { struct bigInt c; init(&c); int carry = 0; // 进位 for(int i = 0; i < a.size || i < b.size; i++) { int sum = a.digit[i] + b.digit[i] + carry; c.digit[c.size++] = sum % 10000; // 每四位分开存储 carry = sum / 10000; } if(carry != 0) { // 处理最高位进位 c.digit[c.size++] = carry; } return c; } // 长整数乘法 struct bigInt mul(struct bigInt a, struct bigInt b) { struct bigInt c; init(&c); for(int i = 0; i < a.size; i++) { int carry = 0; for(int j = 0; j < b.size; j++) { int sum = a.digit[i] * b.digit[j] + carry + c.digit[i+j]; c.digit[i+j] = sum % 10000; carry = sum / 10000; } if(carry != 0) { c.digit[i + b.size] = carry; } } c.size = a.size + b.size - 1; if(c.digit[c.size] != 0) { // 处理最高位进位 c.size++; } return c; } // 输出长整数 void print(struct bigInt a) { printf("%d", a.digit[a.size - 1]); for(int i = a.size - 2; i >= 0; i--) { printf("%04d", a.digit[i]); // 不足四位前面补0 } printf("\n"); } int main() { // 测试代码 struct bigInt a, b, c; char str1[] = "12345678901234567890"; char str2[] = "98765432109876543210"; strToInt(&a, str1); strToInt(&b, str2); c = add(a, b); printf("Addition: "); print(c); c = mul(a, b); printf("Multiplication: "); print(c); return 0; } ``` 上述代码中,使用结构体 `bigInt` 存储长整数,其中 `digit` 数组存储每一位的值,`size` 表示当前位数。`strToInt` 函数将字符串转换为长整数,`compare` 函数比较两个长整数的大小,`add` 函数实现长整数加法,`mul` 函数实现长整数乘法,`print` 函数输出长整数。需要注意的是,因为每四位分开存储,因此在输出时需要特殊处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值