高精度计算是一种程序设计的算法。由于中央处理器的字长限制,如32位CPU中一个整数最大只能取值4,294,967,295。因此在进行更大范围的数值计算中,往往要采取模拟手段。通常通过分离字符的方法通过数字数组进行输入。通过数组倒序输出。通过模拟竖式计算进行计算。这里我们只讨论正整数的运算,其中加法和减法都是最基本的运算,乘除法运算是建立在加减法之上的。
加法的实现算法:
1. 对位,在加数和被加数的前面补上适当数量的0,直到他们的位数一样;
2. 对位后,在加速和被加数前再补一个0,以确定和的最多位数;
3. 从低位开始相加,用一个变量记录进位,每次相加都将对位的加数和被加数以及进位进行求和,将结果保存,然后更新进位变量;
4. 删除答案前面多余的0;
减法的实现算法:
1. 比较加数和被减数的大小,保证被减数为大,且进行记录,然后给被减数前面补0,直到他们的位数一样;
2. 与加法相反,从高位减起(当然从低位减也是可以的),若对位的被减数较大或相等,则直接相减;否则,向前回溯至被减数位不为0,然后对其减1,,按借位的规则进行
赋值;
例如: 31004 - 00005,在进行到最后一位的时候,发现被减数位较小,则向前回溯至第二位1,将第二位减1,给其他0为赋值9,然后用14减去5,最后得到最后结果:
30999
3. 删除答案前面多余的0;
4. 如果原本的被减数较小,则在最后结果前加‘-’;
实现代码:
addition.cpp
#include <iostream>
#include <string>
using namespace std;
string s1, s2;
string add(string a, string b)
{
string ans;
int size1= a.size(), size2 = b.size();
// 补位
if (size1 > size2)
for (int i = 0; i < size1 - size2; ++ i)
b = "0" + b;
else if (size2 > size1)
for (int i = 0; i < size2 - size1; ++ i)
a = "0" + a;
// 再补一次0
a = "0" + a;
b = "0" + b;
ans = a;
size1 = a.size();
// 用以记录进位
int carry = 0;
// 对每位进行加法模拟
for (int i = size1 - 1; i >= 0; -- i)
{
int tmp = a[i] - '0' + b[i] - '0' + carry;
if (tmp < 10)
{
ans[i] = '0' + tmp;
carry = 0;
}
else
{
ans[i] = tmp - 10 + '0';
carry = 1;
}
}
// 去除答案前面多余的0
int i = 0;
while (ans[i] == '0' && i < size1 - 1) { i ++; }
ans = ans.substr(i);
return ans;
}
// 测试
int main()
{
while (cin >> s1 >> s2)
{
cout << add(s1, s2) << endl;
}
return 0;
}
subtraction.cpp
#include <iostream>
#include <string>
using namespace std;
string s1, s2;
string sub(string a, string b)
{
int size1 = a.size(), size2 = b.size(), tmp;
bool negative = 0;
string st, ans;
// 确保被减数大于减数,并进行标记
if (size1 < size2 || (size1 == size2 && a < b))
{
st = a; a = b; b = st;
negative = 1;
}
size1 = a.size();
size2 = b.size();
// 给减数补0
for (int i = 0; i < size1 - size2; ++ i)
b = '0' + b;
ans = a;
// 对每位进行减法模拟
for (int i = 0; i < size1; ++ i)
{
tmp = a[i] - b[i];
if (tmp >= 0)
ans[i] = '0' + tmp;
else
{
int j = i - 1;
// 向前回溯至某为位不为0
while(j >= 0 && ans[j] == '0')
{
ans[j] = '9';
j --;
}
ans[i] = 10 + tmp + '0';
ans[j] = ans[j] - 1;
}
}
// 去除答案前面多余的0
int i = 0;
while (ans[i] == '0' && i < size1 - 1) i ++;
ans = ans.substr(i);
// 给答案前加'-'
if (negative) ans = '-' + ans;
return ans;
}
int main()
{
while (cin >> s1 >> s2)
{
cout << sub(s1, s2) << endl;
}
return 0;
}
addition:
subtraction: