搜索
编程论坛
→
开发语言
→
『 C语言论坛 』
→ 请问这题怎么做~
标题:
请问这题怎么做~
取消只看楼主
z9895512
等 级:
论坛游民
帖 子:24
专家分:43
注 册:2010-6-3
结帖率:
100%
楼主
问题点数:0 回复次数:3
请问这题怎么做~
n个人围成一个圈,每个人对应一个编号,比如说,10个人,编号就是1——10。现在从第一个开始报数1,2,3这三个数。报到三的人就退出圈子,这样报到最后留下来的那个是员阿里编号为几的?(比如4个人,第一轮下来1——4报的数分别是1,2,3,1.报数为3的退出。此时,编号为1的要接上轮的编号为4的继续报数,应报数2.)
输出那个留下来的人的编号~
希望各位帮忙啊,越简洁越好~
搜索更多相关主题的帖子:
阿里
2010-06-08 12:04
z9895512
等 级:
论坛游民
帖 子:24
专家分:43
注 册:2010-6-3
第
2
楼
得分:0
回复 4楼 kingmacrobo
谢谢啦!学到了!
2010-06-09 10:11
z9895512
等 级:
论坛游民
帖 子:24
专家分:43
注 册:2010-6-3
第
3
楼
得分:0
以下是引用
kingmacrobo
在2010-6-8 18:54:04的发言:
第一种方法:
#include
#define M 10
#define N 3
void main(void)
{
int a[M], b[M]; /*数组a存放圈中人的编号,数组b存放出圈人的编号*/
int i, j, k;
for(i = 0; i < M; i++) /*对圈中人按顺序编号1-M*/
a = i + 1;
for(i = M, j = 0; i > 1; i--)
{
/*i表示圈中人个数,初始为M个,剩1个人时结束循环;j表示当前报数人的位置*/
for(k = 1; k <= N; k++) /*1至N报数*/
if(++j > i - 1) j = 0;/*最后一个人报数后第一个人接着报,形成一个圈*/
b[M-i] = j?a[j-1]:a[i-1]; /*将报数为N的人的编号存入数组b*/
if(j)
for(k = --j; k < i; k++)/*压缩数组a,使报数为N的人出圈*/
a[k]=a[k+1];
}
printf("按次序输出出圈人的编号为\n");
for(i = 0;i < M - 1; i++) /*按次序输出出圈人的编号*/
printf("%6d", b);
printf("\n最后一人编号为%6d\n", a[0]); /*输出圈中最后一个人的编号*/
}
蓝色那两行没看懂~那个循环是输出K=N,J=0。但是对下面有什么作用我没弄清楚~ 进而 下面的我也理解不了了~
2010-06-09 11:01
z9895512
等 级:
论坛游民
帖 子:24
专家分:43
注 册:2010-6-3
第
4
楼
得分:0
#include <stdio.h>
#define N 7
#define M 3
main()
{
int a[N],i,j,t=-1,k=0,*q=a,b[N];
for(i=0,j=1;;i++)
{ if(k==N)break;
if(j==M+1)j=1;
if(i==N)i=0;
if(q[i]!=M&&j==M)b[k]=i,k++;
if(q[i]!=M)
{
t=i,q[i]=j;
j++;
}
}
printf("出圈顺序为");
printf("\n");
for(i=0;i<k-1;i++)
printf("%d ",b[i]+1);
printf("\n");
printf("最后留下来的人编号为%d\n",t+1);
}
哎··还是自己的才看得懂,看别人写的真的很头大~~~ 还是谢谢各位了
2010-06-14 20:44
4
1/1页
1
参与讨论请移步原网站贴子:
https://bbs.bccn.net/thread-309592-1-1.html
关于我们
|
广告合作
|
编程中国
|
清除Cookies
|
TOP
|
手机版
编程中国
版权所有,并保留所有权利。
Powered by
Discuz
, Processed in 1.877630 second(s), 10 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved