這道題不難,把數字放到數組裏然後進行兩次排序,得到非遞增和非遞減的兩組數字,不斷重複過程最後會得到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用法
測試結果: