基础算法题:高精度加法(C语言)

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

给定一个正整数,你需要计算这个整数和它对应的反转数的和,例如,输入1234,你应该输出1234 + 4321 = 5555。注意该正整数可能很大(但小于或等于10^25)。

输入描述:

输入有多个测试用例,每个是一个不大于10^25正整数

输出描述:

输出该整数和其反转数的和,按样例输出指定的格式进行输出

示例1:

题目分析:

这个题目易错的点有:
  1. 对于正整数,可能会有前导零,需要特别处理。

  2. 反转数可能会有前导零,需要特别处理。

  3. 如果使用 long long 类型进行计算,可能会溢出,需要使用高精度计算

这个题目考察的内容有:
  1. 字符串的处理,包括字符串转换成整数和字符串倒序。

  2. 高精度加法计算,包括高精度整数的定义、高精度加法的实现和高精度整数的输出。

  3. 代码的实现能力,包括代码的正确性、代码的效率和代码的可读性。

在解决这个问题时,需要注意以上易错的点,并且熟练掌握字符串的处理和高精度计算的方法。同时,需要编写高质量的代码,保证代码的正确性、效率和可读性。

代码如下:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAX_N = 100010;

// 定义一个高精度整数类
struct BigInt
{
    int len, s[MAX_N];

    BigInt()
    {
        // 构造函数,将 s 数组清零,长度设为 1
        memset(s, 0, sizeof(s));
        len = 1;
    }

    BigInt(int num)
    {
        // 构造函数,将 num 转换成高精度整数
        *this = BigInt();
        while (num)
        {
            s[len++] = num % 10;
            num /= 10;
        }
        len--;
    }

    BigInt(const char* num)
    {
        // 构造函数,将字符串 num 转换成高精度整数
        *this = BigInt();
        int l = strlen(num);
        for (int i = 0; i < l; i++)
        {
            s[i] = num[l - i - 1] - '0';
        }
        len = l;
    }

    BigInt operator + (const BigInt& b) const
    {
        // 重载加法运算符
        BigInt c;
        c.len = 0;
        for (int i = 0, g = 0; g || i < max(len, b.len); i++)
        {
            int x = g;
            if (i < len) x += s[i];
            if (i < b.len) x += b.s[i];
            c.s[c.len++] = x % 10;
            g = x / 10;
        }
        return c;
    }

    void clean()
    {
        // 去除高位的零
        while (len > 1 && !s[len - 1]) len--;
    }

    void print()
    {
        // 输出高精度整数
        for (int i = len - 1; i >= 0; i--)
        {
            printf("%d", s[i]);
        }
    }
};

int main()
{
    char s[MAX_N];
    while (scanf("%s", s) == 1)
    {
        // 将字符串 s 转换成高精度整数 x
        BigInt x(s), y;
        int n = x.len;
        for (int i = 0; i < n; i++)
        {
            y.s[i] = x.s[n - i - 1];  // 计算反转数
        }
        y.len = n;
        // 计算 x 和 y 的和
        BigInt z = x + y;
        // 输出结果
        printf("%s + ", s);
        y.print();  // 输出反转数
        printf(" = ");
        z.clean();
        z.print();
        printf("\n");
    }
    return 0;
}

个人心得:

在解决这个问题时,需要注意字符串的处理和高精度计算的方法。对于字符串的处理,需要熟悉字符串的基本操作,包括字符串转换成整数和字符串倒序。对于高精度计算,需要熟悉高精度整数的定义、高精度加法的实现和高精度整数的输出。

同时,在编写代码时,需要注意代码的正确性、效率和可读性。在实现高精度加法时,可以使用高精度整数类来简化代码。在输出高精度整数时,需要注意去除高位的零和输出反转数。在处理前导零时,可以使用一个变量记录前导零的数量,并在输出时特别处理。

总的来说,这个问题虽然看似简单,但是涉及到了字符串的处理和高精度计算,需要综合运用多种知识点来解决。通过解决这个问题,可以提高对字符串和高精度计算的理解和应用能力,同时也可以提高编写高质量代码的能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值