标题:[求助]大虾帮帮忙啊
取消只看楼主
treegrass
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2004-6-23
 问题点数:0 回复次数:4 
[求助]大虾帮帮忙啊

main() {void joseph(int,char*,int,int); char s[]={'1','2','3','4','5','6','7','8','9','10','11','12','13'}; joseph(13,s,1,3); }

void joseph(int n,char*a,int t1,int k) {int t2,i; while(n) {t2=t1+k-1; t2=t2%n; if(t2==0) {printf("%d",a[n]); t1=1;} else {printf("%d",a[t2]); t1=t2; for(i=t2+1;i<=n;i++) a[i-1]=a[i]; } n--; } }

这是个N个人围成一圈,从第(X)个人开始喊数(Y),被喊到的人出列,然后从后面一个继续开始喊(Y),直到全部出列,要求显示出出列的顺序,我这个是做从第一个人开始喊3,其正确出列顺序应该是

3 6 9 12 2 7 11 4 10 5 1 8 13 可是我做的不对啊,大虾们帮帮我啊

搜索更多相关主题的帖子: int joseph char void 
2004-06-23 12:16
treegrass
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2004-6-23
得分:0 

痛苦啊.....快帮帮我啊!

2004-06-23 14:00
treegrass
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2004-6-23
得分:0 

怎么没人 理我啊.......无语

FAINT!!!!!

2004-06-23 17:03
treegrass
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2004-6-23
得分:0 

楼上滴....呵呵 你没有考虑到人是围成一圈滴啊,如果到时喊的人数超过了13怎么办啊,那时你想的循环就用不鸟了啊..

我自己后来想了下,改了改就对了,如下:

main() {void joseph(int,int*,int,int); int s[]={1,2,3,4,5,6,7,8,9,10,11,12,13}; joseph(13,s,1,3); }

void joseph(int n,int*a,int t1,int k) {int t2,i; while(n) {t2=t1+k-1; t2=t2%n; if(t2==0) {printf("%d",a[n]); t1=1;} else {printf("%d",a[t2]); t1=t2; for(i=t2+1;i<=n;i++) a[i-1]=a[i]; } n--; } }

2004-06-23 17:36
treegrass
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2004-6-23
得分:0 

呵呵~~你的思路是对的啊,我在里面就是用 t2=t2%n;来解决这个问题的啊,他是求余,当超过13时求的余就是那个出列的人.

我也是初学者,呵呵~~算法不好说啊,不过你就照着程序写一两个,看看数据你就会知道了.你的第二个问题也可以解决.joseph(13,s,1,3)里的13指有13个人围成一圈,s指你提供的13个人构成的数组,1指从第一个人开始喊,3指喊到3的人出列.开始喊的人和喊的数都可以随便改!!!

2004-06-23 19:31



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-2771-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.668830 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved