本文采用C++模拟了超大正整数的加减法,大整数与long long范围非负数的乘除法
前言
C++语言不像python等语言,由于其天然的特性,可以支持超大整数的计算。
C++的最大整型long long范围仅有-9223372036854775808到9223372036854775807
这显然无法满足某些情况下的需要,但是我们可以将超大整数存入数组,模拟加减乘除的过程,进而计算结果。
一、高精度计算是什么?
高精度计算(Arbitrary-Precision Arithmetic),也被称作大整数(bignum)计算,运用了一些算法结构来支持更大整数间的运算(数字大小超过语言内建整型)。
浅显地说,就是对无法直接存储在某个单一整型变量之中的数进行运算
二、计算思路?
1.将输入的数据存入字符串,并倒序读入数组
代码如下(示例):
string a, b;
cin >> a >> b;
vector<int> A, B;
for (int i = a.size() - 1; i >= 0; i--)
A.push_back(a[i] - '0');
for (int i = b.size() - 1; i >= 0; i--)
B.push_back(b[i] - '0');
2.如何实现相加?
具体思路:用t来记录当前位置三数之和(指A,B数组当前位及进位),t%10表示当前位,t/10表示进位
代码如下(示例):
vector<int> c;
int t = 0;
for (int i = 0; i < A.size() || i < B.size(); i++)
{
if (i < A.size())
t += A[i];
if (i < B.size())
t += B[i];
c.push_back(t % 10);
t /= 10;
}
if (t)
c.push_back(1);
最后判断t如果为1就给结果加上一位。
三、其他运算?
高精度减法,用t来表示当前位置a-b-t,t<0则+10pb后赋1,t>0则pb后赋0,最后去掉t的前导零
高精度乘法,将b视为一个整体,每次用t=t+b*a[i]来更新,pb t%10 t/=10;记得最后的时候t可能有多位,要while(t)一位一位放入c中
高精度除法,从a的存储的最后一位开始,每次用r(上一位的余数)*10+a[i]来除以b,将结果保存在c中,r更新为当前运算所得余数。最后将c倒置,去掉前导零
四、完整版计算器代码实现
//练习:高精度计算器
/*----本程序可以计算两个极大(100000位)的正整数之和,之差----*/
/*---以及一个大数与long long型数(非负数)的乘法和带余除法---*/
//后续有心情的话可以开发一个大整数类,一步到位!
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
void add();
void subtract();
void multiply();
void divide();
int main()
{
while (1)
{
int n;
cout << "1.A+B" << endl;
cout << "2.A-B" << endl;
cout << "3.A*b" << endl;
cout << "4.A/b" << endl;
cin >> n;
switch (n)
{
case 1:
add();
break;
case 2:
subtract();
break;
case 3:
multiply();
break;
case 4:
divide();
break;
default:
cout << "输入不合法" << endl;
break;
}
}
}
void add()
{
string a, b;
cin >> a >> b;
vector<int> A, B;
for (int i = a.size() - 1; i >= 0; i--)
A.push_back(a[i] - '0');
for (int i = b.size() - 1; i >= 0; i--)
B.push_back(b[i] - '0');
vector<int> c;
int t = 0;
for (int i = 0; i < A.size() || i < B.size(); i++)
{
if (i < A.size())
t += A[i];
if (i < B.size())
t += B[i];
c.push_back(t % 10);
t /= 10;
}
if (t)
c.push_back(1);
for (int i = c.size() - 1; i >= 0; i--)
cout << c[i];
cout << endl;
}
void subtract()
{
string a, b;
cin >> a >> b;
int flag = 0;
if (a.size() < b.size())
{
swap(a, b);
flag = 1;
}
else if (a.size() == b.size())
{
int i = 0;
while (a[i] == b[i])
i++;
if (i < a.size() && a[i] < b[i])
{
swap(a, b);
flag = 1;
}
}
vector<int> A, B;
for (int i = a.size() - 1; i >= 0; i--)
A.push_back(a[i] - '0');
for (int i = b.size() - 1; i >= 0; i--)
B.push_back(b[i] - '0');
vector<int> c;
int t = 0;
for (int i = 0; i < A.size(); i++)
{
t = A[i] - t;
if (i < B.size())
t -= B[i];
if (t < 0)
{
c.push_back(t + 10);
t = 1;
}
else
{
c.push_back(t);
t = 0;
}
}
while (c.size() > 1 && c.back() == 0)
c.pop_back();
if (flag == 1)
cout << '-';
for (int i = c.size() - 1; i >= 0; i--)
cout << c[i];
cout << endl;
}
void multiply()
{
string a;
cin >> a;
long long b;
cin >> b;
vector<int> A;
for (int i = a.size() - 1; i >= 0; i--)
A.push_back(a[i] - '0');
vector<int> c;
long long t = 0;
for (int i = 0; i < A.size() || t; i++)
{
if (i < A.size())
t += A[i] * b;
c.push_back(t % 10);
t /= 10;
}
while (c.size() > 1 && c.back() == 0)
c.pop_back();
for (int i = c.size() - 1; i >= 0; i--)
cout << c[i];
cout << endl;
}
void divide()
{
string a;
cin >> a;
long long b;
cin >> b;
if (b == 0)
{
cout << "输入不合法";
return;
}
vector<int> A;
for (int i = a.size() - 1; i >= 0; i--)
A.push_back(a[i] - '0');
vector<int> c;
long long t = 0;
long long r = 0;
for (int i = A.size() - 1; i >= 0; i--)
{
r = r * 10 + A[i];
c.push_back(r / b);
r = r % b;
}
reverse(c.begin(), c.end());
while (c.size() > 1 && c.back() == 0)
c.pop_back();
for (int i = c.size() - 1; i >= 0; i--)
cout << c[i];
cout << endl;
cout << r << endl;
}
总结
以上就是今天要讲的内容,本文仅仅简单介绍了C++高精度计算的一种实现方法,后续可以开发C++专属的大整数类来进一步方便使用。