题目大意:任何一个小于10^4的数 N 都可以通过如下的计算方式得到 0 或者 6174:将 N补足为4位数,然后按数字降序排列得到N1,按升序排列得到N2,将N1-N2的值赋给N,直到 N=0 或 N=6174为止。输出这个计算过程的所有步骤。
直接模拟这个过程即可。不过要注意,将N补足为4位数是隐含信息,一开始我就没注意到。补足的办法可以直接在string后面加‘0’,因为之后还要重新排序,‘0’加在哪里并不重要。
AC代码:
#include <algorithm>
#include <cstdio>
#include <iostream>
using namespace std;
void iterate(string &num, bool &flag)
{
int n1 = stoi(num);
if(n1 % 1111 == 0)
{
printf("%04d - %04d = 0000\n", n1, n1);
flag = true;
return;
}
sort(num.begin(), num.end());
int n2 = stoi(num);
printf("%04d - %04d = %04d\n", n1, n2, n1 - n2);
num = to_string(n1-n2);
while(num.size() < 4) num += '0';
sort(num.begin(), num.end(), greater<char>());
flag = (n1 - n2 == 6174) ? true: false;
}
int main()
{
int N;
scanf("%d", &N);
string num = to_string(N);
while(num.size() < 4) num += '0';
sort(num.begin(), num.end(), greater<char>());
bool flag = false;
while(!flag) iterate(num, flag);
return 0;
}