当前位置: 代码迷 >> C语言 >> [求助]大虾帮帮忙啊
  详细解决方案

[求助]大虾帮帮忙啊

热度:392   发布时间:2004-06-23 12:16:00.0
[求助]大虾帮帮忙啊

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  

----------------解决方案--------------------------------------------------------

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


----------------解决方案--------------------------------------------------------

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

FAINT!!!!!


----------------解决方案--------------------------------------------------------
以下是引用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); //这里要怎样做我就不是很明白了,因为我对循环语句不

// 是很明白 }

}


----------------解决方案--------------------------------------------------------

楼上滴....呵呵 你没有考虑到人是围成一圈滴啊,如果到时喊的人数超过了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--; } }


----------------解决方案--------------------------------------------------------
以下是引用treegrass在2004-06-23 17:36:20的发言:

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

joseph(13,s,1,3); // 我想问一下这个函数的参数是什么意思 还有就是你给你自已的程序写一个注解。因为我的确是一个菜鸟,看不懂你的程序,还有就是如果超过13人的就也可以定义一个变量来把他传到循环语句里面去。还有就是我看了一下你的joseph函数如果用他来叫n个人从m开如始叫的话不知能否做的出。
----------------解决方案--------------------------------------------------------

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

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


----------------解决方案--------------------------------------------------------

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

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


----------------解决方案--------------------------------------------------------
  相关解决方案