任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。
比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。
请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。
循环圈的输出格式仿照:
[82962, 75933, 63954, 61974]
#include
#include
#include
int cha(int num) //将数按每位数字的大小重新排列出一个最大数和一个最小数,并求其差
{
int a[5],i,j;
for(i=0;i<5;i++)
{
a[i]=num%10;
num/=10;
}
for(i=0;i<4;i++)
for(j=i+1;j<5;j++)
{
if(a[i]>a[j])
{
int t=a[i];
a[i]=a[j];
a[j]=t;
}
}
int b[5];
for(i=0;i<5;i++)
{
b[i]=a[4-i];
}
int suma=0,sumb=0;
for(i=0;i<5;i++)
{
suma+=(int)pow(10,(double)(4-i))*a[i];
sumb+=(int)pow(10,(double)(4-i))*b[i];
}
//printf("%d %d",suma,sumb);
return sumb-suma;
}
void zhao(int snum) //查找出循环圈
{
int i,j,k,c[10000],d[80];
c[0]=snum;
for(i=1;;i++)
{
c[i]=cha(snum);
//printf("%d\n",cha(snum));
for(j=0;j
{
if(c[i]==c[j])
{
for(k=j;k
{
d[k-j]=c[k];
}
break;break;
}
}
}
printf("[");
for(i=0;i
printf("%d,",d[i]);
printf("%d]",d[k-1]);
}
int main()
{
int num;
for(num=10000;num<100000;num++)
{
if(cha(num)==0)
continue;
zhao(num);
}
return 0;
}
程序好像进入了死循环,求大神指点!!!! 谢谢!!!!