6174问题

来源:互联网 发布:广州网络维护maxingit 编辑:程序博客网 时间:2024/06/16 20:11

6174问题

时间限制:1000 ms  |  内存限制:65535 KB
难度:2
描述

假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大后得到b,然后用a-b替换原来这个数,并且继续操作。例如,从1234出发,依次可以得到4321-1234=3087、8730-378=8352、8532-2358=6174,又回到了它自己!现在要你写一个程序来判断一个四位数经过多少次这样的操作能出现循环,并且求出操作的次数

比如输入1234执行顺序是1234->3087->8352->6174->6174,输出是4

输入
第一行输入n,代表有n组测试数据。
接下来n行每行都写一个各位数字互不相同的四位数
输出
经过多少次上面描述的操作才能出现循环
样例输入
11234
样例输出
4
来源
[张洁烽]原创
上传者
张洁烽

#include <iostream>#include <algorithm>#include <iomanip>#include<stdio.h> #include<string.h> #include<time.h>using namespace std;int cmp(int x){int c[100],t;memset(c, 0, sizeof(c));  c[1]=x/1000;  c[2]=x/100-10*c[1];  c[3]=x/10-100*c[1]-10*c[2];  c[4]=x%10;  sort(c+1,c+5);  t=1000*c[4]+100*c[3]+10*c[2]+c[1]-(1000*c[1]+100*c[2]+10*c[3]+c[4]);  return t;}int main(){int a[100],bb,k,b[100],d[100];cin>>bb;for(int i=0;i<bb;i++)  cin>>a[i];for(int j=0;j<bb;j++){   k=0;   memset(b, 0, sizeof(b));   b[k]=a[j];   do   {   b[k+1]=cmp(b[k]);   k++;   }while(b[k]!=b[k-1]);   d[j]=k;   cout<<d[j]<<endl;  }   return 0;}


查了百度之后,不管四位数经过多少次变换,最后都是 6174,当然这是建立在有一定数学功底的基础上,下面的代码是 用变换后的四位数是否为6174来判断条件

#include<iostream>#include<algorithm>#include<stdio.h>using namespace std;int main(){int k;cin>>k;while(k--){int n,a[4],n1,n2;scanf("%d",&n);int s=1;while(n!=6174){a[0]=n%10;a[3]=n/1000;a[1]=n/10%10;a[2]=n/100%10;sort(a,a+4);n1=1000*a[3]+100*a[2]+10*a[1]+a[0];n2=1000*a[0]+100*a[1]+10*a[2]+a[3];n=n1-n2;s++;}printf("%d\n",s);}}        


0 0
原创粉丝点击