2023-08-13 一个小题目 A+B problem

一个小题目 A+B problem

  • 前言
  • 一、问题及解答
    • 关碍
  • 总结


前言

一个小算法问题, 记录一下


一、问题及解答

A+B problem( A+B problem )
描述
小明有一个很大的数字,现在他想要在这个数字中间插入一个+号,来求出这个数的结果,并且他还想知道,这些数中哪个数末尾0最多。
输入
第一行一个整数T(t<=100)表示数据组数
接下来有T行,每行一个数字字符(长度在10^5,最高位不为0)
输出
T行,每行一个整数,表示0最多有多少个

输入
2
2017
44445555

输出
0
3

关碍

条件是数字字符长度在10^5, 内置int类型不可能满足, 意味着可能用到高精度, 但本题不用.

因为只是求末尾0, 意味着算法简单很多.

如果最后一个字符数字是x, 只需在数字串中的其它部分找到的10-x, 如果x为0, 只需找到其它的0的个数即可.

#include 
#include 

auto getLastChar(char num) -> char
{
    char res = static_cast<char>('9' + '1' - num);
    return (res == '9' + 1) ? '0' : res;
}

auto countZero(const std::string &str) -> int
{
    char chr = getLastChar(str.back());
    int cnt = 0;
    for (const auto &i : str)
    {
        if (i == chr)
        {
            cnt++;
        }
    }
    return (chr == '5' || chr == '0') ? cnt - 1 : cnt;
}

auto main() -> int
{
    int T = 0;
    std::cin >> T;

    std::vector<std::string> vecStr;
    vecStr.reserve(T);

    std::string str;

    for (int i = 0; i != T; ++i)
    {
        std::cin >> str;
        vecStr.push_back(str);
    }

    for (int i = 0; i != T; ++i)
    {
        std::cout << countZero(vecStr[i]) << '\n';
    }

    return 0;
}


总结

算法不难, 但需要绕个小弯儿.

你可能感兴趣的:(笔记,算法)