这道题不难,把数字放到数组里然后进行两次排序,得到非递增和非递减的两组数字,不断重复过程最后会得到6174这个数字,特别注意的是输出样例中有四个空格,题目中没有说明,但是可以从输出样例中看出来,当时我就是调试这个花了不少时间,然后注意168这类数字需要用0补齐(在高位补),为0168,因为有补0的关系,这里用c语言会比较方便,我是用c++写的,所以会看着相对冗余
#include<iostream>
#include<iomanip>
#include<algorithm>
using namespace std;
bool cmp(int a, int b)//递减排序cmp
{
return a > b;
}
void turnarray(int n, int num[])//这里将n的每一位存到num数组中
{
for (int i = 0; i < 4; i++)
{
num[i] = n % 10;
n /= 10;
}
}
int turnnumber(int num[])//将num数组转换为数字
{
int sum = 0;
for (int i = 0; i < 4; i++)
{
sum = sum * 10 + num[i];
}
return sum;
}
int main()
{//min和max分别表示递增和递减排序后得到的最小值和最大值
int n, max,min;
cin >> n;
int num[5];
while (1)
{
turnarray(n, num);//将n转换为数组
sort(num, num + 4);//对num数组元素中元素从小到大排序
min = turnnumber(num);//获取最小值
sort(num, num + 4, cmp);//对num数组中元素从大到小排序
max = turnnumber(num);//获取最大值
n = max - min;//得到下一个数
cout <<setw(4)<<setfill('0')<< max <<" "<< "-" <<" "<< setw(4)<<setfill('0')<<min<<" "<< "=" << " "<<setw(4)<<setfill('0')<<n << endl;
if (n == 0 || n == 6174) break;
}
return 0;
}
//特别注意setw和setfill用法
测试结果: