数学黑洞
Time Limit: 1500 ms Memory Limit: 65536 KiB
Submit Statistic Discuss
Problem Description
任意一个4位自然数N(N不能是4个数字一样,如1111、2222、….9999是不可以的,N也不能是6174),将组成自然数N的4个数字重新排列,形成一个最大数和最小数,最大数和最小数相减,其差还是自然数,将差的各数字再重新排列,又形成一个最大数和最小数,最大数和最小数相减,其差还是自然数。反复进行,直到差是一个神秘数6174(数学黑洞)结束。
Input
输入数据有多组,每组占一行,每行包含一个4位自然数N。输入文件直到EOF为止!
Output
对每组输入,输出有2行。第一行是所有的差,以空格分隔,最后一个数后也有空格;第二行是差的个数。
Sample Input
1000
1500
3000
Sample Output
999 8991 8082 8532 6174
5
5085 7992 7173 6354 3087 8352 6174
7
2997 7173 6354 3087 8352 6174
6
Hint
Source
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int min[4]= {0};
int max[4]= {0};
int num[4]= {0};
int main()
{
int n,i,j,t,f,k,s;
while(~scanf("%d",&n))
{s=0;
while(n!=6174)
{
num[0]=n%10;
num[1]=n/10%10;
num[2]=n/100%10;
num[3]=n/1000;
for(i=0; i<3; i++)
{
f=i;
for(j=i+1; j<=3; j++)
{
if(num[j]<=num[f])
{
f=j;
}
}
t=num[i];
num[i]=num[f];
num[f]=t;
}
for(i=0,k=0; i<=3; i++)
{
min[k++]=num[i];
}
for(i=3,k=0; i>=0; i--)
{
max[k++]=num[i];
}
n=(max[0]*1000+max[1]*100+max[2]*10+max[3])-(min[0]*1000+min[1]*100+min[2]*10+min[3]);
printf("%d ",n);
s++;
}
printf("\n");
printf("%d\n",s);
}
return 0;
}
Think:
首先开3个数组,一个存分解的N的各个部分,然后把这些部分排好序,然后一个数组存放从大到小的数,另一个存放从小到大的数,在条件N!=6174的前提加减即可
该博客探讨了数学中的一个有趣现象——数字黑洞,即4位数通过特定操作最终会收敛到6174。文章提供了一道编程题,要求实现这一过程,并给出了示例输入和输出,说明了递归算法的运行步骤和结果统计。
791

被折叠的 条评论
为什么被折叠?



