高精度算法也可以称为大整数算法,用于处理那些长度过大,long long
都无法解决的问题。
基本思路,利用数组等数据结构存储大整数,然后模拟大整数的运算,来实现高精度运算。
大整数加法
利用两个string存储整数,然后根据两者的长度关系,将短的前面补上0,以实现长度的等长关系,方便后续运算。
定义一个int变量用于记录进位关系
从sting的尾部(个位)开始逐位相加对10取余加到结果string的前面string支持直接相加实现相连效果
注意也要把前一位的进位信息加上去。并记录本位的进位信息。
注意由于加法可能最高位会进一位,所以要注意最后看看首位是否需要加一个1
#include <bits/stdc++.h>
using namespace std;
int main()
{
//a+b=c
string a, b, c;
cin >> a >> b;
int as=a.size(),bs=bs.size();
//短的补0
if (a.size() > b.size())
{
for (int i = 0; i < as-bs; i++)
{
b = "0" + b;
}
}
else
{
for (int i = 0; i < bs-as; i++)
{
a = "0" + a;
}
}
int flag = 0;//进位信息变量
for (int i = a.size() - 1; i >= 0; i--)
{
//添加到首位
c = char((a[i] + b[i] - 2 * '0' + flag) % 10 + '0') + c;
//记录进位信息
flag = (a[i] + b[i] - 2 * '0' + flag) / 10;
}
//是否需要首位补1
if (flag)
{
c = '1' + c;
}
//输出
cout << c;
}
大整数减法
利用两个string存储整数,然后根据两者的长度关系,将短的前面补上0,以实现长度的等长关系,方便后续运算。
定义一个int变量用于记录借位
利用字符串比较来保证a总是大的那个数,否则交换一下,并记录一下以便输出的时候输出负号
模拟减法
#include <bits/stdc++.h>
using namespace std;
int main()
{
string a, b, c;
int f = 0;
cin >> a >> b;
int as = a.size();
int bs = b.size();
if (a.size() > b.size())
{
for (int i = 0; i < as - bs; i++)
{
b = "0" + b;
}
}
else
{
for (int i = 0; i < bs - as; i++)
{
a = "0" + a;
}
}
if (b > a)
{
f = 1;
string s;
s = b;
b = a;
a = s;
}
int flag = 0;
for (int i = a.size() - 1; i >= 0; i--)
{
if (a[i] - flag < b[i])
{
c = char(a[i] - flag - b[i] + 10 + '0') + c;
flag = 1;
}
else
{
c = char(a[i] - flag - b[i] + '0') + c;
flag = 0;
}
}
if (f)
{
cout << "-";
}
cout << c;
}