【PTA数据结构 | C语言版】大整数相乘运算

本专栏持续输出数据结构题目集,欢迎订阅。

文章目录

题目

请编写程序,求两个不超过 1000 位的大整数的乘积。

输入格式:

输入在两行中分别给出两个整数,保证不超过 1000 位。

输出格式:

在一行中输出两个整数的乘积。但如果乘积超过了 1000 位,则仅输出 错误:位数超限。。

输入样例 1:

123456789012345

987654321098765

输出样例 1:

121932631137021071359549253925

输入样例 2:

-1122375689

4998765432012345

输出样例 2:

-5610492795904238375880705

代码

c 复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_DIGITS 1000
#define MAX_RESULT (2 * MAX_DIGITS)

// 反转字符串
void reverse(char *str, int len) {
    for (int i = 0; i < len / 2; i++) {
        char temp = str[i];
        str[i] = str[len - i - 1];
        str[len - i - 1] = temp;
    }
}

// 大整数乘法
void multiply(char *num1, char *num2, char *result) {
    int len1 = strlen(num1);
    int len2 = strlen(num2);
    int *res = (int *)calloc(len1 + len2, sizeof(int));

    // 处理符号
    int sign = 1;
    if (num1[0] == '-') {
        sign *= -1;
        num1++;
        len1--;
    }
    if (num2[0] == '-') {
        sign *= -1;
        num2++;
        len2--;
    }

    // 反转字符串以便从低位开始处理
    reverse(num1, len1);
    reverse(num2, len2);

    // 乘法运算
    for (int i = 0; i < len1; i++) {
        for (int j = 0; j < len2; j++) {
            res[i + j] += (num1[i] - '0') * (num2[j] - '0');
            res[i + j + 1] += res[i + j] / 10;
            res[i + j] %= 10;
        }
    }

    // 找到结果的最高位
    int i = len1 + len2 - 1;
    while (i > 0 && res[i] == 0) i--;

    // 转换为字符串
    int idx = 0;
    if (sign == -1 && !(i == 0 && res[0] == 0)) {
        result[idx++] = '-';
    }
    for (; i >= 0; i--) {
        result[idx++] = res[i] + '0';
    }
    result[idx] = '\0';

    free(res);
}

int main() {
    char num1[MAX_DIGITS + 2];  // 包含符号和空字符
    char num2[MAX_DIGITS + 2];
    char result[MAX_RESULT + 2];  // 包含符号和空字符

    // 读取输入(不进行校验)
    fgets(num1, sizeof(num1), stdin);
    fgets(num2, sizeof(num2), stdin);

    // 去除换行符
    num1[strcspn(num1, "\n")] = 0;
    num2[strcspn(num2, "\n")] = 0;

    // 计算乘积
    multiply(num1, num2, result);

    // 检查结果位数
    int len = strlen(result);
    int start = (result[0] == '-') ? 1 : 0;
    if (len - start > 1000) {
        printf("错误:位数超限。\n");
    } else {
        printf("%s\n", result);
    }

    return 0;
}