C++实现大整数计算器(高精度加减乘除)——————极易理解,源码直用

本文采用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++专属的大整数类来进一步方便使用。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值