题目大意:
给一个4位数字组成的数,按照以下3步进行运算:
(1)从大到小排列(2)从小到大排列(3)计算差值。。。重复上述过程,直到最后结果变成6174或者0
解题思路:
按照运算步骤模拟这个过程就可以啦
代码如下:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
int equal(int n)
{
int m=n/10,a=n%10;
while(m!=0)
{
if((m%10)!=a)
return 0;
m=m/10;
}
return 1;
}
int wrong(int n)
{
int num[10],a;
int i=0,m=n;
while(m!=0)
{
num[i++]=m%10;
m=m/10;
}
if(i>4||i<4||equal(n))
return 1;
return 0;
}
int cmp(const void *a,const void *b)
{
return (*(int *)a-*(int *)b);
}
int most(int n)
{
int number;
int num[10]={0};
int k=n,j,i=0;
int sum=0;
while(k!=0)
{
num[i++]=k%10;
k=k/10;
}
number=i;
qsort(num,number,sizeof(num[0]),cmp);
for(j=i-1;j>=0;j--)
{
sum=sum*10+num[j];
}
return sum;
}
int least(int n)
{
int num[10]={0};
int k=n,j,i=0;
int sum=0;
while(k!=0)
{
num[i++]=k%10;
k=k/10;
}
qsort(num,i,sizeof(num[0]),cmp);
for(j=0;j<=i-1;j++)
{
sum=sum*10+num[j];
}
return sum;
}
int main()
{
int n,m;
int a,b,count;
while(scanf("%d",&n)&&(n!=-1))
{
printf("N=%d:\n",n);
count=0;
if(wrong(n))
{
printf("No!!\n");
continue;
}
m=n;
while(m!=0&&m!=6174)
{
b=most(m);a=least(m);
m=b-a;
printf("%d-%d=%d\n",b,a,m);
count++;
}
printf("Ok!! %d times\n",count);
}
return 0;
}