高精度加法怎么搞?

对于输入的两个不超过100位数字的非负整数,给出两数之和。

输入格式:

在两行中分别给出两个不超过100位数字的非负整数

输出格式:

在一行中输出两数之和

123
12

输出样例:

135

高精度加法,顾名思义,就是位数很多的两个数相加。

既然位数很多,就不能用longlong来存储了!

应该先输入字符串,再把字符串转化为数字,放在数组之中。

这个过程交给一个函数完成,就叫这个函数cinit();

之后再 定义两个string(当然要先引入头文件)ac,bc;

之后,再定义两个整形数组,来把数一位一位的储存起来。

先让定义的两个数组各项为0

之后,还要记录位数,所以把这两个整形

长这样子:

void cinit()
{
    cin >> ac >> bc;
    a[0] = ac.size();
    b[0] = bc.size();
    for (int i = 1; i <= a[0]; i += 1)
    {
        a[i] = ac[a[0] - i] - '0';     //  因为要保证个位与个位相加,所以要倒叙存放位数
    }
    for (int i = 1; i <= b[0]; i += 1)
    {
        b[i] = bc[c[0] - i] - '0';    //  因为要保证个位与个位相加,所以要倒叙存放位数
    }
}

之后,再进行一位一位的相加,同时注意进位。

其实进位问题很好处理,只需要和10比较。

同时建立一个数组,来进行存储相加之后的结果。

不过注意,这个数组的位数可能是比a和b这两个数组中最大的多1的,因为有进位的情况

一位一位相加的过程交给work()实现:

void work()
{
    c[0] = (a[0] > b[0]) ? a[0] : b[0];
    for (int i = 1; i <= c[0]; i += 1)
    {
        c[i] = a[i] + b[i];
        if (c[i] >= 10)
        {
            c[i] %= 10;
            c[i + 1] += 1;
        }
    }
}

之后,就在将刚刚用于存储结果的数列进行倒叙输出,不过注意前导0的问题,也即是输出的第一项不可以为0;

这个交给coutit()来实现:

void coutit()
{
    if (c[c[0] + 1] != 0)
    {
        cout << c[c[0] + 1];
    }
    for (int i = c[0]; i > 1; i -= 1)
    {
        cout << c[i];
    }
}

最后就是这样子啦!

#include <iostream>
#include <string>
using namespace std;

int a[201];
int b[201];
int c[201];
string ac, bc;

void cinit();
void work();
void coutit();

int main()
{
    for (int& x : a)
    {
        x = 0;
    }
    for (int& x : b)
    {
        x = 0;
    }
    for (int& x : c)
    {
        x = 0;
    }

    cinit();
    work();
    coutit();
    return 0;
}

void cinit()
{
    cin >> ac >> bc;
    a[0] = ac.size();
    b[0] = bc.size();
    for (int i = 1; i <= a[0]; i += 1)
    {
        a[i] = ac[a[0] - i] - '0';     //  因为要保证个位与个位相加,所以要倒叙存放位数
    }
    for (int i = 1; i <= b[0]; i += 1)
    {
        b[i] = bc[b[0] - i] - '0';    //  因为要保证个位与个位相加,所以要倒叙存放位数
    }
}

void work()
{
    c[0] = (a[0] > b[0]) ? a[0] : b[0];
    for (int i = 1; i <= c[0]; i += 1)
    {
        c[i] += a[i] + b[i];
        if (c[i] >= 10)
        {
            c[i] %= 10;
            c[i + 1] += 1;
        }
    }
}

void coutit()
{
    if (c[c[0] + 1] != 0)
    {
        cout << c[c[0] + 1];
    }
    for (int i = c[0]; i >= 1; i -= 1)
    {
        cout << c[i];
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值