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 可是我做的不对啊,大虾们帮帮我啊
----------------解决方案--------------------------------------------------------
痛苦啊.....快帮帮我啊!
----------------解决方案--------------------------------------------------------
怎么没人 理我啊.......无语
FAINT!!!!!
----------------解决方案--------------------------------------------------------
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--; } }
----------------解决方案--------------------------------------------------------
楼上滴....呵呵 你没有考虑到人是围成一圈滴啊,如果到时喊的人数超过了13怎么办啊,那时你想的循环就用不鸟了啊..
----------------解决方案--------------------------------------------------------
呵呵~~你的思路是对的啊,我在里面就是用 t2=t2%n;来解决这个问题的啊,他是求余,当超过13时求的余就是那个出列的人.
我也是初学者,呵呵~~算法不好说啊,不过你就照着程序写一两个,看看数据你就会知道了.你的第二个问题也可以解决.joseph(13,s,1,3)里的13指有13个人围成一圈,s指你提供的13个人构成的数组,1指从第一个人开始喊,3指喊到3的人出列.开始喊的人和喊的数都可以随便改!!!
----------------解决方案--------------------------------------------------------
那你这样是不是每一次都得去修改源程序?如果做到不用去修改源程序那不是更好吗?
有时间我们可以多多的讨论一些问题
----------------解决方案--------------------------------------------------------