• 6174问题


    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行每行都写一个各位数字互不相同的四位数
    输出
    经过多少次上面描述的操作才能出现循环
    样例输入
    1
    1234
    样例输出
                 4

      刚开始将问题想得较为复杂,在别人的提点明白,截止到6174跳出循环,在主函数中需用到 函数 void f(int n)  中 c,d无法返回两个值,所以将c,d设为全局变量    

    #include<stdio.h> 
    int c , d;
    void f(int n)
    {
    	int j,k,b[4],x,a,y;
    	for(j=0;j<4;j++)
              b[j]=0;
    		a=0;
    		while(n>0)
    		{
    			x=n%10;
    			n=n/10;
    			b[a]=x;
    			a++;
    		}
    		for(j=0;j<4;j++)
    		{
    			for(k=0;k<3-j;k++)
    			{
    				if(b[k+1]<b[k])
    				{
    					y=b[k];
    					b[k]=b[k+1];
    					b[k+1]=y;
    				}
    			}
    		}
    		c=b[3]*1000+b[2]*100+b[1]*10+b[0];
    		d=b[0]*1000+b[1]*100+b[2]*10+b[3];
    }
    int main()
    {
    	int m,i,a,n;
    	scanf("%d",&m);
    	for(i=1;i<=m;i++)
    	{
    		scanf("%d",&n);
    		c = 0 , d = 0 ;
    		a=1;
    		f(n);
    		while(c-d!=6174)
    		{
    		f(c-d);
    		a++;
    		}
    
    	printf("%d
    ",a+1);
    	}
    	return 0;
    }


     

  • 相关阅读:
    C++常变量
    C++变量(C++变量定义、变量赋值、命名规则)
    463. Island Perimeter
    500. Keyboard Row
    811. Subdomain Visit Count
    901. Online Stock Span
    419. Battleships in a Board
    620. Not Boring Movies
    893. Groups of Special-Equivalent Strings
    575. Distribute Candies
  • 原文地址:https://www.cnblogs.com/NYNU-ACM/p/4237341.html
Copyright © 2020-2023  润新知