原题链接:
注意点:
1.将数字重新排列时,要考虑到有0的情况。比如说:4,如果不补上缺失的0,将4拆分后重新构成新的数字进入计算会变成0004-0004=0000,进入循环而超时。
代码:
#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>
using namespace std;
#define endl '\n'
int N;
vector<int> digits;
int a, b;
void split(int x) {
digits.clear();
while (x != 0) {
digits.emplace_back(x % 10);
x /= 10;
}
while (digits.size() != 4) {
digits.emplace_back(0);
}
}
bool cmp(int& x, int& y) {
return x > y;
}
int nonIncrease() {
int res = 0;
sort(digits.begin(), digits.end(), cmp);
for (int i = 0; i < 4; i++) {
res = res * 10 + digits[i];
}
return res;
}
int nonDecrease() {
int res = 0;
sort(digits.begin(), digits.end());
for (int i = 0; i < 4; i++) {
res = res * 10 + digits[i];
}
return res;
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> N;
split(N);
if (digits[0] == digits[1] && digits[1] == digits[2] && digits[2] == digits[3]) {
cout << N << " - " << N << " = 0000";
}
else {
int ans = a - b;
int temp = N;
while (ans != 6174) {
split(temp);
a = nonIncrease();
b = nonDecrease();
ans = a - b;
temp = ans;
cout << setw(4) << setfill('0') << a;
cout << " - ";
cout << setw(4) << setfill('0') << b;
cout << " = ";
cout << setw(4) << setfill('0') << ans << endl;
}
}
return 0;
}