6174问题

来源:互联网 发布:阿里云短信授权委托书 编辑:程序博客网 时间:2024/05/23 12:03

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


在Dev cpp和系统评测通过

# include <stdio.h>
int fun1(int n);
int fun2(int n);
int main()
{
int max, n, i, j, t;
int min, m;
scanf("%d",&m);
while(m--)
{
t=1;
scanf("%d",&n);
if (n == 6174)
printf("%d\n",2);
if(n != 6174)
{
j=n;
while (j != 6174)
{
max = fun1(j);
min = fun2(j); 
j = max - min;
t++;
}
printf("%d\n",t);
}
}
return 0;

int fun1(int n)
{
int i, j, k, t, max;
int a[4];
a[0]=n/1000;
a[1]=n/100%10;
a[2]=n%100/10;
a[3]=n%100%10;
for (i = 0; i < 4; i++)
{
for (j = i, k = i + 1; k < 4; k++)
if (a[j] < a[k])
j = k;
if (j != i)
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
max = a[0]*1000+a[1]*100+a[2]*10+a[3]*1;
return max;
}
int fun2(int n)
{
int i, j, k, t, min;
int a[4];
a[0]=n/1000;
a[1]=n/100%10;
a[2]=n%100/10;
a[3]=n%100%10;
for (i = 0; i < 4; i++)
{
for (j = i, k = i + 1; k < 4; k++)
if (a[j] > a[k])
j = k;
if (j != i)
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
min = a[0]*1000+a[1]*100+a[2]*10+a[3]*1;
return min;
}


最优解:【不是我写的代码!!!】

 
#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
int main()
{
//freopen("1.txt","r",stdin);
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);
}
}        


2015年1月19日16:05:30 

0 0