PAT乙级 1019数字黑洞

PAT乙级 1019数字黑洞

题目:

给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的 6174,这个神奇的数字也叫 Kaprekar 常数。例如,我们从6767开始,将得到
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
… …
现给定任意 4 位正整数,请编写程序演示到达黑洞的过程。

输入样例 1:6767

输出样例 1:
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174

输入样例 2:2222

输出样例 2:
2222 - 2222 = 0000
题解:
1.我们要注意,题目不仅仅允许输入四位数,也可以允许输入一位数、二位数和三位数(在前面补零),如果未考虑测试点2,3,4不能通过。
2.注意string字符串内部排序时,使用sort函数时的bool cmp函数的写法。
3.可以用string.insert函数补0
**代码如下:**参考了柳神的博客

#include 
#include 
using namespace std;
bool cmp(char a, char b) {return a > b;}
int main() {
string s;
cin >> s;
s.insert(0, 4 - s.length(), '0');
do {
string a = s, b = s;
sort(a.begin(), a.end(), cmp);
sort(b.begin(), b.end());
int result = stoi(a) - stoi(b);
s = to_string(result);
s.insert(0, 4 - s.length(), '0');
cout << a << " - " << b << " = " << s << endl;
} while (s != "6174" && s != "0000");
return 0;
}

总结
熟练使用C++的string能起到事半功倍的效果。

你可能感兴趣的:(PAT)