我们将这个问题拆解成几个步骤,来完成结果。
一、欣赏结果
先来欣赏一下完成后的运行的结果:
高精度加法事例
输入第一个加数: 49837295871039
输入第二个加数: 39487219029837
结果是: 89324514900876
高精度减法事例
输入被减数: 1398737632984812
输入减数: 98763498
结果是: 1398737534221314
二、什么是高精度数
- 【含义】无法使用基础类型存储的数字。
- 【存储】这里使用
char
数组,更稳定一些。
三、输入
题目描述
输入两个高精度数(不超过10^500),并输出两个高精度数。
提示
数组的长度直接用505即可,别看10~500~很大,其实只有501位。
参考答案
cpp#include <iostream> #include <cstring> using namespace std; int main() { char num1[505] = {}; char num2[505] = {}; cin >> num1 >> num2; cout << num1 << endl << num2; return 0; }
四、转换为整型&倒序存储
cpp
// 存储的整型数组
int num1_int[505] = {};
int num2_int[505] = {};
// 取两个数字的长度
int len_num1 = strlen(num1);
int len_num2 = strlen(num2);
// 遍历存储
for (int i = 0; i <= len_num1-1; i++)
num1_int[len_num1-i-1] = num1[i] - 48;
for (int i = 0; i <= len_num2-1; i++)
num2_int[len_num2-i-1] = num2[i] - 48;
五、计算
1. 得到加的次数
cpp
int len_ans = max(len_num1, len_num2);
2. 遍历做加法
(1) 没有进位时
cpp
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char num1[505] = {};
char num2[505] = {};
cin >> num1 >> num2;
// 存储的整型数组
int num1_int[505] = {};
int num2_int[505] = {};
// 取两个数字的长度
int len_num1 = strlen(num1);
int len_num2 = strlen(num2);
// 遍历存储
for (int i = 0; i <= len_num1-1; i++)
{
num1_int[len_num1-i-1] = num1[i] - 48;
}
for (int i = 0; i <= len_num2-1; i++)
{
num2_int[len_num2-i-1] = num2[i] - 48;
}
// 存储运算结果
int len_ans = max(len_num1, len_num2);
int ans[505] = {};
for (int i = 0; i <= len_ans-1; i++)
{
ans[i] = num1_int[i] + num2_int[i];
}
// 倒序输出运算结果
for (int i = len_ans-1; i >= 0; i--)
{
cout << ans[i];
}
return 0;
}
(2) 有进位时完善后的代码
cpp
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char num1[505] = {};
char num2[505] = {};
cin >> num1 >> num2;
// 存储的整型数组
int num1_int[505] = {};
int num2_int[505] = {};
// 取两个数字的长度
int len_num1 = strlen(num1);
int len_num2 = strlen(num2);
// 遍历存储
for (int i = 0; i <= len_num1-1; i++)
{
num1_int[len_num1-i-1] = num1[i] - 48;
}
for (int i = 0; i <= len_num2-1; i++)
{
num2_int[len_num2-i-1] = num2[i] - 48;
}
// 计算
int len_ans = max(len_num1, len_num2);
int ans[505] = {};
int in = 0;
for (int i = 0; i <= len_ans-1; i++)
{
ans[i] = num1_int[i] + num2_int[i] + in;
in = ans[i] / 10; // 进位的结果
ans[i] %= 10; // 存储真实结果的最后一位
}
// 特例先行
if (in > 0)
{
ans[len_ans] = in;
len_ans++;
}
for (int i = len_ans-1; i >= 0; i--)
{
cout << ans[i];
}
return 0;
}
附录
高精度减法
cpp
int ans[505] = {};
int len_ans = len_num1; // 默认大数-小数
for (int i = 0; i <= len_ans-1; i++)
{
if (num1_int[i] < num2_int[i]) // 借位的情况
{
num1_int[i+1]--; // 借一
num1_int[i] += 10; // 加10
}
ans[i] = num1_int[i] - num2_int[i]; // 减法
}
// 输出前写下面的代码
while(ans[len_ans-1] == 0 && len_ans > 1) // 最高位的情况,前导0且结果非0的情况
{
len_ans--; // 减少,后面不会输出前面的0
}
完整代码
cpp
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char num1[505] = {};
char num2[505] = {};
cin >> num1 >> num2;
// 存储的整型数组
int num1_int[505] = {};
int num2_int[505] = {};
// 取两个数字的长度
int len_num1 = strlen(num1);
int len_num2 = strlen(num2);
// 遍历存储
for (int i = 0; i <= len_num1-1; i++)
{
num1_int[len_num1-i-1] = num1[i] - 48;
}
for (int i = 0; i <= len_num2-1; i++)
{
num2_int[len_num2-i-1] = num2[i] - 48;
}
// 计算
int ans[505] = {};
int len_ans = len_num1; // 默认大数-小数
for (int i = 0; i <= len_ans-1; i++)
{
if (num1_int[i] < num2_int[i]) // 借位的情况
{
num1_int[i+1]--; // 借一
num1_int[i] += 10; // 加10
}
ans[i] = num1_int[i] - num2_int[i]; // 减法
}
// 输出前写下面的代码
while(ans[len_ans-1] == 0 && len_ans > 1) // 特例先行
{
len_ans--; // 不会输出前面的0了
}
for (int i = len_ans-1; i >= 0; i--)
{
cout << ans[i];
}
return 0;
}
需要所有完整代码,进入: