个人博客地址:https://travis1024.github.io/
高精度计算
1. 问题描述
用整型数组表示10进制大整数(超过2^32的整数),数组的每个元素存储大整数的一位数字,实现大整数的加减法。
2. 问题分析
-
大整数无法使用常规的整数类型进行表示,需要考虑使用字符串或者数组对输入的大整数进行存储。
-
加减法的模拟过程需要仔细考虑,同时也需要考虑如何处理大整数的符号问题。
3. 处理方法设计(算法步骤)
-
首先使用字符串存储输入的两个大整数;
-
然后对两个字符串的第一位的符号位进行提取并记录,如果第一位为数字位则认为该整数为正数;
-
随后根据两个大整数的符号位以及选择的加法或者减法运算进行条件判断,跳转到符合其条件的逻辑结构;
-
在进行加减法时,首先将字符串的每一位存储到int类型的数组中(不包括符号位),然后从最低位依次向最高位处理,计算结果存储到int类型的result数组中;
-
将result数组中的结果转换成string类型并返回,最终根据大整数符号位及加减法的选择对最终结果的符号进行判断并输出。
4.测试数据设计
减法 | 大整数1 | 888888888888888888888888888888888888 |
---|---|---|
大整数2 | -666666666666666666666666666666666666 | |
减法 | 大整数1 | 666666666666666666666 |
大整数2 | 888888888888888888888 | |
加法 | 大整数1 | -8888888888888888888888888 |
大整数2 | 6666666666666666666666666 | |
减法 | 大整数1 | 0 |
大整数2 | 22222222222222222222222222222222222222 |
5.测试结果分析
6.程序结构
7.源代码
#include <iostream>
#include <sstream>
#include<string>
#define SUM 100
using namespace std;
bool Judge(string A, string B) {
for (int j = 0; j < A.size(); j++) {
if (A[j] > B[j]) return true;
if (A[j] < B[j]) return false;
}
return true;
}
string IntToString(int &i) {
string s;
stringstream ss(s);
ss << i;
return ss.str();
}
string addition(string A, string B, int max) {
string end;
int result[SUM] = {0}, array_1[SUM] = {0}, array_2[SUM] = {0};
for (int i = 0; i < A.size(); i++)
array_1[SUM - A.size() + i] = A[i] - '0';
for (int i = 0; i < B.size(); i++)
array_2[SUM - B.size() + i] = B[i] - '0';
for (int i = 0; i < max; i++) {
result[SUM - i - 1] = array_1[SUM - i - 1] + array_2[SUM - i - 1] + result[SUM - i - 1];
if (result[SUM - i - 1] >= 10) {
result[SUM - i - 2] = result[SUM - i - 2] + 1;
result[SUM - i - 1] = result[SUM - i - 1] - 10;
}
}
for (int i = 0; i < max + 1; i++) {
int &now = result[SUM - max + i - 1];
end += IntToString(now);
}
if (end[0] == '0') end.erase(0, 1);
return end;
}
string subtraction(string A, string B, int max) {
string end;
int result[SUM] = {0}, array_1[SUM] = {0}, array_2[SUM] = {0};
for (int i = 0; i < A.size(); i++)
array_1[SUM - A.size() + i] = A[i] - '0';
for (int i = 0; i < B.size(); i++)
array_2[SUM - B.size() + i] = B[i] - '0';
for (int i = 0; i < max; i++) {
result[SUM - i - 1] = array_1[SUM - i - 1] - array_2[SUM - i - 1] + result[SUM - i - 1];
if (result[SUM - i - 1] < 0) {
result[SUM - i - 2] = result[SUM - i - 2] - 1;
result[SUM - i - 1] = result[SUM - i - 1] + 10;
}
}
for (int i = 0; i < max + 1; i++) {
int &now = result[SUM - max + i - 1];
end += IntToString(now);
}
if (end[0] == '0') end.erase(0, 1);
return end;
}
int main() {
int index = 0, A_flag = 1, B_flag = 1, flag = 0;
string A, B, result;
cout << "Please choose <1>-addition or <2>-subtraction (Enter the Numbers): ";
cin >> index;
cout << "Please enter the first number: ";
cin >> A;
if (A[0] == '-') {
A_flag = -1;
A.erase(0, 1);
}
cout << "Please enter the second number: ";
cin >> B;
if (B[0] == '-') {
B_flag = -1;
B.erase(0, 1);
}
int max_number = (A.size() > B.size()) ? A.size() : B.size();
if (A_flag == 1 && B_flag == 1) {
if (index == 1) result = addition(A, B, max_number);
if (index == 2) {
if (A.size() > B.size() || (A.size() == B.size() && Judge(A, B))) result = subtraction(A, B, max_number);
if (A.size() < B.size() || (A.size() == B.size() && !Judge(A, B))) {
result = subtraction(B, A, max_number);
result.insert(0, "-");
}
}
} else if (A_flag == 1 && B_flag == -1) {
if (A.size() > B.size() || (A.size() == B.size() && Judge(A, B))) {
if (index == 1) result = subtraction(A, B, max_number);
if (index == 2) result = addition(A, B, max_number);
}
if (A.size() < B.size() || (A.size() == B.size() && !Judge(A, B))) {
if (index == 1) {
result = subtraction(B, A, max_number);
result.insert(0, "-");
}
if (index == 2) result = addition(A, B, max_number);
}
} else if (A_flag == -1 && B_flag == 1) {
if (index == 1) {
if (A.size() > B.size() || (A.size() == B.size() && Judge(A, B))) {
result = subtraction(A, B, max_number);
result.insert(0, "-");
}
if (A.size() < B.size() || (A.size() == B.size() && !Judge(A, B))) {
result = subtraction(B, A, max_number);
}
}
if (index == 2) {
result = addition(A, B, max_number);
result.insert(0, "-");
}
} else if (A_flag == -1 && B_flag == -1) {
if (index == 1) {
result = addition(A, B, max_number);
result.insert(0, "-");
}
if (index == 2) {
if (A.size() > B.size() || (A.size() == B.size() && Judge(A, B))) {
result = subtraction(A, B, max_number);
result.insert(0, "-");
}
if (A.size() < B.size() || (A.size() == B.size() && !Judge(A, B))) {
result = subtraction(B, A, max_number);
}
}
}
cout << "The result is " << result << endl;
return 0;
}