c语言编写程序实现两个超长正整数(每个最长80位数字)的加法和乘法运算。
时间: 2023-11-26 15:04:37 浏览: 202
c语言版的超长正整数的乘法
实现这个问题需要用到大数运算,即对于超长正整数的加法和乘法运算,需要使用字符串或数组进行处理,具体实现方法如下:
1. 加法运算
将两个超长正整数分别存储在两个char类型的数组中,然后从个位开始逐位相加,并且考虑进位的情况,最后得到结果。
示例代码如下:
```c
#include <stdio.h>
#include <string.h>
#define MAXLEN 81
int main() {
char num1[MAXLEN], num2[MAXLEN], sum[MAXLEN];
memset(num1, 0, sizeof(num1));
memset(num2, 0, sizeof(num2));
memset(sum, 0, sizeof(sum));
// 输入两个超长正整数
scanf("%s %s", num1, num2);
// 逐位相加,并考虑进位
int carry = 0;
int len1 = strlen(num1), len2 = strlen(num2);
int i = len1 - 1, j = len2 - 1, k = 0;
while (i >= 0 || j >= 0) {
int a = i >= 0 ? num1[i] - '0' : 0;
int b = j >= 0 ? num2[j] - '0' : 0;
int s = a + b + carry;
sum[k++] = s % 10 + '0';
carry = s / 10;
i--, j--;
}
if (carry > 0) sum[k++] = carry + '0';
// 输出结果
printf("%s\n", strrev(sum));
return 0;
}
```
2. 乘法运算
将两个超长正整数分别存储在两个char类型的数组中,然后从个位开始逐位相乘,并考虑进位的情况,最后得到结果。
示例代码如下:
```c
#include <stdio.h>
#include <string.h>
#define MAXLEN 161
int main() {
char num1[MAXLEN], num2[MAXLEN], product[MAXLEN];
memset(num1, 0, sizeof(num1));
memset(num2, 0, sizeof(num2));
memset(product, 0, sizeof(product));
// 输入两个超长正整数
scanf("%s %s", num1, num2);
// 逐位相乘,并考虑进位
int len1 = strlen(num1), len2 = strlen(num2);
for (int i = len1 - 1; i >= 0; i--) {
int carry = 0;
int k = len1 - i - 1;
for (int j = len2 - 1; j >= 0; j--) {
int a = num1[i] - '0', b = num2[j] - '0';
int p = a * b + carry + (product[k] == '\0' ? 0 : product[k] - '0');
product[k] = p % 10 + '0';
carry = p / 10;
k++;
}
if (carry > 0) product[k] = carry + '0';
}
// 输出结果
printf("%s\n", strrev(product));
return 0;
}
```
以上就是实现两个超长正整数的加法和乘法运算的方法。由于本算法没有进行优化,可能在处理较长的数字时会出现效率问题。如果需要处理更大的数字,可以考虑使用高精度库进行处理。
阅读全文