有n个人围成一圈,顺序排号。从第一个人开始报数,凡报到3的人退出圈子,问最后留下的是几号?

阳光_八月 2014-04-21 12:14:08
我的问题是:我弄不明白while循环的条件为什么是圈外人数<总人数-1,而不是圈外人数<总人数。
代码如下:
#include<stdio.h>
#define max 15
int main()
{
int i,k,n,m,num[max],*p;
printf("输入开始报数时总人数:");
scanf("%d",&n);//开始报数前的人数。
p=num;//指针指向数组第一位num[0]
for(i=0;i<n;i++)//把n个人进行编号为1—n。
*(p+i)=i+1;
printf("依次出圈的人的编号:");
i=0;k=0;m=0;
while(m<n-1)//m为圈外人数。
//如果设n=9,则循环只运行到m=7。为什么不是m<n???
{
if(*(p+i)!=0)//报数。
k++;
if(k==3)
{
printf("%d ",*(p+i));//按顺序依次输出出圈的人的编号。
*(p+i)=0;//对于出圈人数,其值置为0。
m++;//圈外人数加1。
k=0;//重新开始报数。
}
i++;//指针指向下一位。
if(i==n)//指针移到最后一位时,重新赋值
i=0;//printf("\n");
}
for(i=0;i<n;i++)//输出最后一位出圈的人的编号
if(*(p+i)!=0)
printf("\n最后一位出圈的人的编号:%d\n",*(p+i));
return 0;
}


请各位大神指教~~~~~
...全文
5362 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
L-75 2014-12-10
  • 打赏
  • 举报
回复 1
#include <stdio.h>
int main()
{
	int a[100];
	int n;
	int i;
	int count;
	int j=0;
	int index=0;
	scanf("%d",&n);
	
	for(i=0;i<n;i++)
		a[i]=i+1;
	for(i=0,count=1;(n-index)!=1;i=(i+1)%(n-index),count++)
	{
		if(count%3==0)
		{
			for(j=i;j<n-index;j++)
				a[j]=a[j+1];
			count++;		//判断是否是3(被3整除)
			index++;		//index记录淘汰了几个数
		}
	}	
		
	printf("%d\n",a[0]);
	return 0;
}
L-75 2014-12-10
  • 打赏
  • 举报
回复
#include <stdio.h>
int main()
{
	int a[100];
	int n;
	int i;
	int count;
	int j=0;
	int index=0;
	scanf("%d",&n);
	
	for(i=0;i<n;i++)
		a[i]=i+1;
	for(i=0,count=1;(n-index)!=1;i=(i+1)%(n-index),count++)
	{
		if(count%3==0)
		{
			for(j=i;j<n-index;j++)
				a[j]=a[j+1];
			count++;		//判断是否是3(被3整除)
			index++;		//index记录淘汰了几个数
		}
	}	
		
	printf("%d\n",a[0]);
	return 0;
}
L-75 2014-12-10
  • 打赏
  • 举报
回复
#include <stdio.h> int main() { int a[100]; int n; int i; int count; int j=0; int index=0; scanf("%d",&n); for(i=0;i<n;i++) a[i]=i+1; for(i=0,count=1;(n-index)!=1;i=(i+1)%(n-index),count++) { if(count%3==0) { for(j=i;j<n-index;j++) a[j]=a[j+1]; count++; //判断是否是3(被3整除) index++; //index记录淘汰了几个数 } } printf("%d\n",a[0]); return 0; }
hw7be 2014-04-21
  • 打赏
  • 举报
回复
m等于n-1时,圈内只有1个人了,while循环不用再执行了。如果while循环条件改为m<n,while循环退出后,数组num的元素全部被置0,无法输出最后一个出圈人的编号。
阳光_八月 2014-04-21
  • 打赏
  • 举报
回复
引用 1 楼 halfword1982 的回复:
m等于n-1时,圈内只有1个人了,while循环不用再执行了。如果while循环条件改为m<n,while循环退出后,数组num的元素全部被置0,无法输出最后一个出圈人的编号。
我看懂了,谢谢你。因为之前没有想明白,然后自己在草稿纸上计算时也弄错了。
707wk 2014-04-21
  • 打赏
  • 举报
回复
同上。。。。

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧