永发信息网

C语言5位黑洞数

答案:3  悬赏:80  手机版
解决时间 2021-03-13 03:54
  • 提问者网友:我没有何以琛的痴心不悔
  • 2021-03-12 05:55
任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。
比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。
请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。
循环圈的输出格式仿照:
[82962, 75933, 63954, 61974]
#include <stdio.h>
#include <stdio.h>
#include <math.h>
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<i;j++)
{
if(c[i]==c[j])
{
for(k=j;k<i;k++)
{
d[k-j]=c[k];
}
break;break;
}
}
}
printf("[");
for(i=0;i<k-1;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;
}
程序好像进入了死循环,求大神指点!!!! 谢谢!!!!
最佳答案
  • 五星知识达人网友:街头电车
  • 2021-03-12 07:31
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
inta[90000][10]={0},b[90000][10]={0};
charc[100000]={0},str[6]="";
intsort(intnum)
{
    itoa(num,str,10);
    for(inti=0;i<4;i++)
        for(intj=i;j<5;j++)
            if(str[i]<str[j])
                {charc=str[i];str[i]=str[j];str[j]=c;}
    returnatoi(str);
}
intmain()
{
    for(inti=10001;i<=99999;i++)
    {     
        for(intj=0,num=i;j<10;j++)
            a[i-10000][j]=num=sort(num)-atoi(strrev(str));//欲形成循环圈
        intj=0;
        for(;j<10;j++)//找出循环圈
        {
            if(a[i-10000][9-j]==b[i-10000][0]) break;
            b[i-10000][j]=a[i-10000][9-j];
            if(c[b[i-10000][j]]||a[i-10000][9-j]<10000)break; 
            elsec[b[i-10000][j]]=1;
            printf("%-6d",b[i-10000][j]);
        }
        if(j>1)printf("\n");
    }
    getchar();
    return0;
}

这是我和一个网友比赛比谁的代码短的结晶。
全部回答
  • 1楼网友:你哪知我潦倒为你
  • 2021-03-12 08:25
那就说明循环的出口判断不正确啊,你手动算你的算法正确吗?最重要的错误是两个break不能连用啊,一个break都跳出了,怎么还会有第二个break的事????帮你改成了下,勉强可以用了,但是你应该再加上查重啊,否则输出太多重复的 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 #include <stdio.h> #include <stdio.h> #include <math.h> intcha(intnum)  //将数按每位数字的大小重新排列出一个最大数和一个最小数,并求其差 {  inta[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])    {     intt=a[i];     a[i]=a[j];     a[j]=t;    }   }   intb[5];   for(i=0;i<5;i++)   {    b[i]=a[4-i];   }   intsuma=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);   returnsumb-suma; } voidzhao(intsnum)  //查找出循环圈 {  inti,j,k,c[10000],d[8000];  c[0]=snum;  inttem = 0;  boolfind = false;  for(i=1;i<10000;i++)  {   c[i]=cha(c[i-1]);   //printf("%d\n",cha(snum));   for(j=0;j<i;j++)   {    if(c[i]==c[j])    {     for(k=j,tem=0;k<i;k++,tem++)     {      d[k-j]=c[k];     }     find = true;    }   }   if(find) break;  }  printf("[");  for(i=0;i<tem-1;i++)   printf("%d,",d[i]);  printf("%d]\n",d[tem-1]); } intmain() {  intnum;  for(num=10000;num<100000;num++)  {   if(cha(num)==0)    continue;   zhao(num);  }  return0; }
  • 2楼网友:蓝房子
  • 2021-03-12 07:49
那就说明循环的出口判断不正确啊,你手动算你的算法正确吗?最重要的错误是两个break不能连用啊,一个break都跳出了,怎么还会有第二个break的事?
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯