任意一个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;
}
程序好像进入了死循环,求大神指点!!!! 谢谢!!!!
C语言5位黑洞数
答案:3 悬赏:80 手机版
解决时间 2021-03-13 03:54
- 提问者网友:我没有何以琛的痴心不悔
- 2021-03-12 05:55
最佳答案
- 五星知识达人网友:街头电车
- 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
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的事?
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯