1 条题解
-
1
题目分析
题意简述
输入一系列字符串 ,对于每个字符串 :
- 若 为
"-1"
,则结束程序; - 若 的长度不为 ,或者 的四个字符完全相同,则输出 “No!!” ;
- 否则,将 的字符按降序排列得到字符串 ,再将其反转得到字符串 ,通过不断计算 转换后的整数与 转换后的整数的差值,并重复上述排序、反转和计算过程,直到差值为 或 。最后输出计算过程的步骤数 以及 “Ok!! t times” ,并在过程中输出每一步的减法运算式子。
输入
- 多组测试用例,每组为一个字符串 。
- 当输入的字符串 为
"-1"
时,程序终止。
输出
- 对于每组输入(除
"-1"
外),首先输出 “N=in:” ( 为输入的字符串); - 若不满足条件(长度不为 或四个字符相同),输出 “No!!” ;
- 若满足条件,输出每一步的减法运算式子(如 “整数1 - 整数2 = 差值” ),最后输出 “Ok!! t times” ( 为达到差值为 或 时的计算步骤数)。
解题思路
数据转换函数
- 定义
tostring
函数:将整数 转换为字符串。通过不断取余并拼接字符的方式,从低位到高位构建字符串。 - 定义
toint
函数:将字符串 转换为整数。从字符串的末尾开始,将每个字符对应的数字乘以相应的 的幂次方,然后累加得到整数。
核心操作逻辑
- 对输入的字符串 进行合法性检查,若长度不为 或四个字符相同,则直接输出 “No!!” 。
- 若字符串合法,使用
sort
函数 并结合自定义的比较函数cmp_1
对字符串 按字符降序排序,再通过reverse
函数 反转排序后的字符串得到 。 - 进入循环,不断计算 转换后的整数与 转换后的整数的差值,若差值为 或 ,则结束循环;否则将差值转换为字符串,重复排序、反转和计算的过程,同时记录计算的步骤数 。
- 循环结束后,输出每一步的减法运算式子以及最终的结果 “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; }
代码说明
- 比较函数
cmp_1
:用于定义字符的比较规则,使sort
函数 能够按字符降序对字符串进行排序。 - 数据转换函数
tostring
函数:实现将整数转换为字符串,通过循环取余并拼接字符,构建从低位到高位的字符串表示。toint
函数:实现将字符串转换为整数,从字符串末尾开始,根据每个字符对应的数字乘以相应的 的幂次方并累加得到整数。
- 主程序逻辑
- 循环读取输入字符串 ,当 为
"-1"
时结束程序。 - 对输入字符串进行合法性检查,若不满足条件则输出 “No!!” 并继续下一组输入。
- 若字符串合法,对其进行排序和反转操作,然后进入循环进行减法运算、结果转换和再次排序反转的操作,直到差值为 或 ,同时记录步骤数 。
- 循环过程中输出每一步的减法运算式子,循环结束后输出最终结果 “Ok!! t times” 。
- 循环读取输入字符串 ,当 为
- 若 为
- 1
信息
- ID
- 351
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者