永发信息网

C语言5位黑洞数

答案:3  悬赏:80  手机版
解决时间 2021-03-13 03:54
任意一个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;
}
程序好像进入了死循环,求大神指点!!!! 谢谢!!!!
最佳答案
|
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;
}

这是我和一个网友比赛比谁的代码短的结晶。
全部回答
那就说明循环的出口判断不正确啊,你手动算你的算法正确吗?最重要的错误是两个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; }
那就说明循环的出口判断不正确啊,你手动算你的算法正确吗?最重要的错误是两个break不能连用啊,一个break都跳出了,怎么还会有第二个break的事?
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
小学生四年级身高1.5米,体重100斤正常吗?如
东莞哪里可以办货车运输从业资格证,危险品从
判定从植物体榨出的黄色液体是否含有脂肪、甘
SQL端口从1433改为3433后,sqlserver
搜狗拼音输入法和五笔输入法怎么切换不了
过了诉讼期
损失贷款金额是什么意思
勃的左边念什么
西安工业科技技术学院真的有那么不好吗?
西城小学地址有知道的么?有点事想过去
起亚K21.4科技版是什么型号?
该患者的诊断是A.急性粒细胞白血病B.慢性淋巴
怎样申请微 信号
htc hd7 t9292为什么连不起WLAN
内径6毫米的轴套热处理好还是氮化处理好
推荐资讯
如何申请机票代售点,卖机票需要什么条件
红色警戒3适合几岁小孩玩?
怎么做小学四年级的数学报
如何做大蛋糕与分好蛋糕
有谁知道这枚四川铜币值钱吗?这是家中祖传下
梦缘量贩KTV地址在哪,我要去那里办事
今天晚上炫舞梦工厂有520吗
大光明眼镜公司总店地址在哪,我要去那里办事
把老公我爱你翻译成阿拉伯数字怎么翻?
什么是双重内陆国
一个数a1等于负三分之2a2=3分之1a3=3分之4a4=
庾岭镇中心卫生院地址在什么地方,想过去办事
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?