C语言(3)6174问题

来源:互联网 发布:ssh连接指定端口 编辑:程序博客网 时间:2024/06/08 11:59
描述

假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到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 <stdio.h>int main(int argc, char **argv){int i,j,n,m;int buf[1024]={0};scanf("%d", &n);for(i=0; i<n; i++){scanf("%d", &buf[i]);}int nbuf[4]={0};int m1,m2,m3,m4;int max,min,temp;for(i=0; i<n; i++){m=0;while(1){nbuf[0]=buf[i]%10;nbuf[1]=(buf[i]%100)/10;nbuf[2]=(buf[i]/100)%10;nbuf[3]=buf[i]/1000;#if 0for(j=0; j<4; j++){printf("%d ", nbuf[j]);}#endif/*最小*/m1=nbuf[0];for(j=0; j<4; j++){if(m1>nbuf[j]){m1=nbuf[j];min=j;}if(m1==nbuf[0]){min=0;}}/*最大*/m4=nbuf[0];for(j=0; j<4; j++){if(m4<nbuf[j]){m4=nbuf[j];max=j;}if(m4==buf[0]){max=0;}}/*第二小*/if(min != 0){m2=nbuf[0];for(j=0; j<4; j++){if((m2>nbuf[j])&&(j!=min)){m2=nbuf[j];}}}else{//printf("test!\n");m2=nbuf[1];for(j=2; j<4; j++){if((m2>nbuf[j])){m2=nbuf[j];}}}m3=nbuf[0]+nbuf[1]+nbuf[2]+nbuf[3]-m1-m2-m4;//printf("\n\n%d %d %d %d\n", m1, m2, m3, m4);temp=m4*1000+m3*100+m2*10+m1-m1*1000-m2*100-m3*10-m4;//printf("temp=%d\n", temp);if(temp == buf[i]){break;}else{buf[i]=temp;}m++;}printf("%d\n", m+1);}return 0;}

原创粉丝点击