大整数运算
1.大整数加法
整数存储类型 | 范围 |
---|---|
short (2 byte) | - 215 ~ (215 - 1) |
int (4 byte) | - 231 ~ (231 - 1) |
long long (8 byte) | - 263 ~ (263 - 1) |
- 使用字符串进行数字的输入
- 将数字拆分存储在数组中,num[0]存储数字长度,num[1]存储个位、num[2]十位、num[3]百位……以此类推倒序存储
- 按照加法规则将数组中对应的数字相加后存入结果数组中
- 对需要进位的数字进行进位
#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.大整数乘法
- 使用字符串进行数字的输入
- 将数字拆成一位位数字存储在数组中,num[0]存储数字长度,num[1]存储个位、num[2]存储十位、num[3]存储百位,以此类推倒着存储
- 按照乘法规则对数组中对应的数字进行操作存入结果数组中:ans[i + j - 1] = n1[i] * n2[j];
- 对需要进位的数字进行进位
#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;
}
tips:文章部分内容参考算法刷题课程,题解图示内容及代码根据老师课程、以及自己对知识的理解,进行二次整理和部分补充,仅供学习参考使用,不可商业化。