gesp(二级)(8)洛谷:B3866:[GESP202309 二级] 数字黑洞
gesp(二级)(8)洛谷:B3866:[GESP202309 二级] 数字黑洞
题目描述
给定一个三位数,要求各位不能相同。例如, 352 352 352 是符合要求的, 112 112 112 是不符合要求的。将这个三位数的三个数字重新排列,得到的最大的数,减去得到的最小的数,形成一个新的三位数。对这个新的三位数可以重复上述过程。神奇的是,最终一定会得到 495 495 495!
试试看,重新排列 352 352 352,得到的最大数为 532 532 532,最小数为 235 235 235,它们的差是 297 297 297;变换 297 297 297,得到 972 − 279 = 693 972-279=693 972−279=693;变换 693 693 693, 963 − 369 = 594 963-369=594 963−369=594;变换 594 594 594, 954 − 459 = 495 954-459=495 954−459=495。因此,经过 4 4 4 次变换得到了 495 495 495。
现在,输入的三位数,你能通过编程得出,这个三位数经过多少次变换能够得到 495 495 495 吗?
输入格式
输入一行,包含一个符合要求的三位数 N N N。
输出格式
输出一行,包含一个整数 C C C,表示经过 C C C 次变换得到 495 495 495。
样例 #1
样例输入 #1
352
样例输出 #1
4
AC代码(100分)
#include<bits/stdc++.h>
using namespace std;
//按题意模拟
int n,a[4],cnt;
int main(){
cin>>n;
//模拟变换过程
while(n!=495){
//记录n原来的值
int tmp=n;
//将三位数的个位、十位、百位存到数组a中
for(int i=1;i<=3;i++){
a[i]=tmp%10;
tmp/=10;
}
//a数组升序排序
sort(a+1,a+4);
//求出最大值和最小值
int x=a[3]*100+a[2]*10+a[1];//最大值
int y=a[1]*100+a[2]*10+a[3];//最小值
//计算差
n=x-y;
//统计次数
cnt++;
}
//输出答案
cout<<cnt;
return 0;
}
文末彩蛋:
点击王老师青少年编程主页有更多精彩内容