【PTA数据结构 | C语言版】大整数相乘运算
本专栏持续输出数据结构题目集,欢迎订阅。
文章目录
- 题目
- 代码
题目
请编写程序,求两个不超过 1000 位的大整数的乘积。
输入格式:
输入在两行中分别给出两个整数,保证不超过 1000 位。
输出格式:
在一行中输出两个整数的乘积。但如果乘积超过了 1000 位,则仅输出 错误:位数超限。。
输入样例 1:
123456789012345
987654321098765
输出样例 1:
121932631137021071359549253925
输入样例 2:
-1122375689
4998765432012345
输出样例 2:
-5610492795904238375880705
代码
#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;
}