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

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
darrenyang
Rank: 1
等 级:新手上路
帖 子:51
专家分:0
注 册:2004-5-5
得分:0 
以下是引用treegrass在2004-06-23 12:16:09的发言:

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 可是我做的不对啊,大虾们帮帮我啊

你上面的做法说句实话我是看不懂,因为我也C也不久。

以下是我对这道题的理解写的程序,但有一点就是因为我对循环的用法不是很明白所以程序是错误的,希望能给你一点启示。

#include "stdio.h" main() { char s[]={'1','2','3','4','5','6','7','8','9','10','11','12','13'}; int i; int k; printf("Number:"); scanf("%d",&i); //输入你开始叫数的位置 for(s[k]=0+i;s[k]<=13;s[k]++); //s[]等于0+i就是你叫数的位置,每一次都要加上i的位数,直

直到s[k]<=13就是13个数都叫满的时候结束循环。 { printf("%d",s); //这里要怎样做我就不是很明白了,因为我对循环语句不

// 是很明白 }

}

2004-06-23 17:10
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
darrenyang
Rank: 1
等 级:新手上路
帖 子:51
专家分:0
注 册:2004-5-5
得分:0 
以下是引用treegrass在2004-06-23 17:36:20的发言:

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

joseph(13,s,1,3); // 我想问一下这个函数的参数是什么意思 还有就是你给你自已的程序写一个注解。因为我的确是一个菜鸟,看不懂你的程序,还有就是如果超过13人的就也可以定义一个变量来把他传到循环语句里面去。还有就是我看了一下你的joseph函数如果用他来叫n个人从m开如始叫的话不知能否做的出。
2004-06-23 17:57
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
darrenyang
Rank: 1
等 级:新手上路
帖 子:51
专家分:0
注 册:2004-5-5
得分:0 

那你这样是不是每一次都得去修改源程序?如果做到不用去修改源程序那不是更好吗?

有时间我们可以多多的讨论一些问题

2004-06-24 14:35



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




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

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