C:围圈报数,内蒙古,892,1709,程序设计

问题描述:有n个人围成一圈,顺序排号。现从第i个人开始,由1至k不断报数,凡报到k的人出列。重复报数过程,直到所有人都出列为止。请编写程序模拟这n个人出列的顺序。

思路:

        将n个人排列在数组中,将位置序号1~n存放到对应数据元素中a[0~n-1],因此第i个人在数组a[i-1]的位置上;从指定的第i个人(a[i-1])开始从1到k循环报数,只要没有退出就参与报数,直到有人报到k,输出存放的位置,将数组元素置为0表示已退出,退出人数加1;从下一没退出的人重新开始报数;当超过数组末尾时,i置为0从数组头开始再循环报数,直至退出人数达到总人数减1,不再报数;从头遍历数组找到没有被退出的元素,输出存放位置。

代码:

#include<stdio.h>
int main(){
	int i,k,m,n,num[50],k1;			
	scanf("%d %d %d",&n,&k,&i);		//n表示参与报数的总人数;k表示一次报数的值;i表示从第几个人开始报数; 
	for(int j=0;j<n;j++) num[j]=j+1;	//给n个人排序号,第i个人的数组下标为i-1; 
	i-=1;		//从第i个人的在数组中位置开始报数; 
	k1=0;		//k1表示每次报数计数变量1~k; 
	m=0;		//m表示退出人数;
	while(m<n-1){					//当m=n-1时,也就是n-m=n-(n-1)=1仅剩一个人时退出循环 
		if(num[i]!=0){				//只要没有被退出,就参与计数;
			k1++; 
		} 
		if(k1==k){					//计数到k时,该位置退出; 
			printf("%d ",num[i]);	//输出退出的位置; 
			num[i]=0;				//退出的位置置为0;
			k1=0; 					//k开始重新计数; 
			m++;					//退出的人数加1; 
		}
		i++;
		if(i==n) i=0; 				//从头开始遍历;
	} 
	//从头遍历找没有退出的位置,输出; 
	i=0;						
	while(num[i]==0) i++;
	printf("最后留下了%d号",num[i]) ;
} 

思路表述欠佳,但是程序总体是可行的,希望大家多提宝贵的建议。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

舟桥居士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值