本专栏持续输出数据结构题目集,欢迎订阅。
文章目录
题目
请编写程序,求两个不超过 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;
}