B3866 [GESP202309 二级] 数字黑洞 题解
题目描述
给定一个三位数,要求各位不能相同。例如,352 是符合要求的,112 是不符合要求的。将这个三位数的三个数字重新排列,得到的最大的数,减去得到的最小的数,形成一个新的三位数。对这个新的三位数可以重复上述过程。神奇的是,最终一定会得到 495!
试试看,重新排列 352,得到的最大数为 532,最小数为 235,它们的差是 297;变换 297,得到 972−279=693;变换 693,963−369=594;变换 594,954−459=495。因此,经过 4 次变换得到了 495。
现在,输入的三位数,你能通过编程得出,这个三位数经过多少次变换能够得到 495 吗?
输入格式
输入一行,包含一个符合要求的三位数 N。
输出格式
输出一行,包含一个整数 C,表示经过 C 次变换得到 495。
输入输出样例
输入 #1复制
352
输出 #1复制
4
AC代码
#include<bits/stdc++.h> using namespace std; int main(){ int n; cin>>n; for(int t=0;;t++){ if(n==495){ cout<<t<<endl; break; } int s1=n%10,s2=n/10%10,s3=n/100; int x=0,y=0; if(s1>=s2&&s2>=s3){ x=s1*100+s2*10+s3; y=s3*100+s2*10+s1; } else if(s1>=s3&&s3>=s2) { x=s1*100+s3*10+s2; y=s2*100+s3*10+s1; } else if(s2>=s1&&s1>=s3){ x=s2*100+s1 *10+s3; y=s3*100+s1 *10+s2; } else if(s2>=s3&&s3>=s1){ x=s2*100+s3*10+s1; y=s1*100+s3*10+s2; } else if(s3>=s1&&s1>=s2){ x=s3*100+s1*10+s2; y=s2*100+s1*10+s3; } else{ x=s3*100+s2*10+s1; y=s1*100+s2*10+s3; } n=x-y; } return 0; }