1 条题解

  • 1
    @ 2025-5-6 0:42:49

    题目分析

    题意简述

    输入一系列字符串 inin,对于每个字符串 inin

    • inin"-1",则结束程序;
    • inin 的长度不为 44 ,或者 inin 的四个字符完全相同,则输出 “No!!”
    • 否则,将 inin 的字符按降序排列得到字符串 inin,再将其反转得到字符串 rere ,通过不断计算 inin 转换后的整数与 rere 转换后的整数的差值,并重复上述排序、反转和计算过程,直到差值为 0061746174 。最后输出计算过程的步骤数 tt 以及 “Ok!! t times” ,并在过程中输出每一步的减法运算式子。

    输入

    • 多组测试用例,每组为一个字符串 inin
    • 当输入的字符串 inin"-1" 时,程序终止。

    输出

    • 对于每组输入(除 "-1" 外),首先输出 “N=in:”inin 为输入的字符串);
    • 若不满足条件(长度不为 44 或四个字符相同),输出 “No!!”
    • 若满足条件,输出每一步的减法运算式子(如 “整数1 - 整数2 = 差值” ),最后输出 “Ok!! t times”tt 为达到差值为 0061746174 时的计算步骤数)。

    解题思路

    数据转换函数

    • 定义 tostring 函数:将整数 xx 转换为字符串。通过不断取余并拼接字符的方式,从低位到高位构建字符串。
    • 定义 toint 函数:将字符串 xx 转换为整数。从字符串的末尾开始,将每个字符对应的数字乘以相应的 1010 的幂次方,然后累加得到整数。

    核心操作逻辑

    • 对输入的字符串 inin 进行合法性检查,若长度不为 44 或四个字符相同,则直接输出 “No!!”
    • 若字符串合法,使用 sort 函数 并结合自定义的比较函数 cmp_1 对字符串 inin 按字符降序排序,再通过 reverse 函数 反转排序后的字符串得到 rere
    • 进入循环,不断计算 inin 转换后的整数与 rere 转换后的整数的差值,若差值为 0061746174 ,则结束循环;否则将差值转换为字符串,重复排序、反转和计算的过程,同时记录计算的步骤数 tt
    • 循环结束后,输出每一步的减法运算式子以及最终的结果 “Ok!! t times”

    代码实现

    #include<string>
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    
    bool cmp_1(char a, char b)
    {
        return a > b;
    }
    
    string tostring(int x)
    {
        string ans = "";
        while (x)
        {
            ans = (char)('0' + x % 10) + ans;
            x /= 10;
        }
        return ans;
    }
    
    int toint(string x)
    {
        int ans = 0, i = 0;
        for (int k = x.length() - 1; k >= 0; k--)
        {
            ans += (int)(x[k] - '0') * pow(10.0, i++);
        }
        return ans;
    }
    
    int main()
    {
        string in;
        while (cin >> in)
        {
            if (in == "-1") break;
            cout << "N=" << in << ":" << endl;
            if ((in.length() != 4) || in[0] == in[1] && in[1] == in[2] && in[2] == in[3])
            {
                cout << "No!!" << endl;
                continue;
            }
            sort(in.begin(), in.end(), cmp_1);
            string re = in;
            reverse(re.begin(), re.end());
            int t = 0;
            while (true)
            {
                t++;
                int ans = toint(in) - toint(re);
                cout << toint(in) << "-" << toint(re) << "="
                    << ans << endl;
                if (ans == 0 || ans == 6174)
                {
                    break;
                }
                else{
                    in = tostring(ans);
                    sort(in.begin(), in.end(), cmp_1);
                    re = in;
                    reverse(re.begin(), re.end());
                }
            }
            cout << "Ok!! " << t << " times" << endl;
        }
        return 0;
    }
    

    代码说明

    1. 比较函数 cmp_1:用于定义字符的比较规则,使 sort 函数 能够按字符降序对字符串进行排序。
    2. 数据转换函数
      • tostring 函数:实现将整数转换为字符串,通过循环取余并拼接字符,构建从低位到高位的字符串表示。
      • toint 函数:实现将字符串转换为整数,从字符串末尾开始,根据每个字符对应的数字乘以相应的 1010 的幂次方并累加得到整数。
    3. 主程序逻辑
      • 循环读取输入字符串 inin,当 inin"-1" 时结束程序。
      • 对输入字符串进行合法性检查,若不满足条件则输出 “No!!” 并继续下一组输入。
      • 若字符串合法,对其进行排序和反转操作,然后进入循环进行减法运算、结果转换和再次排序反转的操作,直到差值为 0061746174 ,同时记录步骤数 tt
      • 循环过程中输出每一步的减法运算式子,循环结束后输出最终结果 “Ok!! t times”
    • 1

    信息

    ID
    351
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者