大整数运算


1.大整数加法

整数存储类型 范围
short(2 byte) - 215 ~ (215 - 1)
int(4 byte) - 231 ~ (231 - 1)
long long(8 byte) - 263 ~ (263 - 1)
  1. 使用字符串进行数字的输入
  2. 将数字拆分存储在数组中,num[0]存储数字长度,num[1]存储个位、num[2]十位、num[3]百位……以此类推==倒序存储==
  3. 按照==加法规则==将数组中对应的数字相加后存入结果数组中
  4. 对需要进位的数字进行进位
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<iostream>
#include<cstring>
using namespace std;

char s1[1005], s2[1005];//输入的两个数字存储在字符串中
int num1[1005], num2[1005];//输入的两个数字转化存储在数组中
int sum[1005];//数字相加后的结果存储数组

int main(){
//1.使用字符串进行数字的输入
cin >> s1 >> s2;
num1[0] = strlen(s1);
num2[0] = strlen(s2);
//2.将数字拆成一位位数字存储在数组中
for(int i = 0, j = num1[0]; s1[i]; ++i, --j){
num1[j] = s1[i] - '0';
}
for(int i = 0, j = num2[0]; s2[i]; ++i, --j){
num2[j] = s2[i] - '0';
}
//3.按照加法规则将数组中对应的数字相加后存入结果数组中
sum[0] = max(num1[0], num2[0]);
for(int i = 1; i <= sum[0]; ++i){
sum[i] = num1[i] + num2[i];
}
//4.对需要进位的数字进行进位
for(int i = 1; i <= sum[0]; ++i){
if(sum[i] > 9){
sum[i + 1] += sum[i] / 10;
sum[i] %= 10;
//如果是最高位进位,则结果数字的长度+1
if(i == sum[0]){
sum[0]++;
}
}
}
for(int i = sum[0]; i > 0; --i){
cout << sum[i];
}
cout << endl;

return 0;
}

2.大整数乘法

  1. 使用字符串进行数字的输入
  2. 将数字拆成一位位数字存储在数组中,num[0]存储数字长度,num[1]存储个位、num[2]存储十位、num[3]存储百位,以此类推倒着存储
  3. 按照乘法规则对数组中对应的数字进行操作存入结果数组中:ans[i + j - 1] = n1[i] * n2[j];
  4. 对需要进位的数字进行进位

image-20210417183217793

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

char s1[1005], s2[1005];
int n1[1005], n2[1005], ans[2005];

int main(){
//1.使用字符串进行数字的输入
cin >> s1 >> s2;
n1[0] = strlen(s1), n2[0] = strlen(s2);
//2.将数字拆成一位位数字存储在数组中
for(int i = 0, j = n1[0]; i < n1[0]; ++i, --j){
n1[j] = s1[i] - '0';
}
for(int i = 0, j = n2[0]; i < n2[0]; ++i, --j){
n2[j] = s2[i] - '0';
}
//3.按照乘法规则对数组中对应的数字进行操作存入结果数组中:ans[i + j - 1] = n1[i] * n2[j];
ans[0] = n1[0] + n2[0] - 1;
for(int i = 1; i <= n1[0]; ++i){//遍历第一个乘数
for(int j = 1; j <= n2[0]; ++j){//遍历第一个乘数
ans[i + j - 1] += n1[i] * n2[j];
}
}
//4.对需要进位的数字进行进位,乘法进位可能一次性需要进多位
for(int i = 1; i <= ans[0]; ++i){
if(ans[i] > 9){
ans[i + 1] += ans[i] / 10;
ans[i] %= 10;
if(i == ans[0]){
ans[0]++;
}
}
}
for(int i = ans[0]; i > 0; --i){
cout << ans[i];
}
cout << endl;
return 0;
}