语言每日一练——第45天:n人围圈报数问题"/>
C语言每日一练——第45天:n人围圈报数问题
C语言每日一练
2021年10月27日
文章目录
- 题目描述
- 分析
- 代码实现
- 运行结果
- 网上参考
题目描述
有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位
分析
可以采用直观的数组法
,将这些人的编号放入一个数组,数组值为0
表示淘汰,非0
表示在场,一直循环遍历
数组,每经过3个在场的数组值(非0),就将第3个数组值置0,直到数组中只剩一个
有效值(数组值非0),此时这个数组的下标即留下来的成员编号。
代码实现
#include <stdio.h>int main()
{int num = 0; //总人数int left_num = 0; //当前余下的人数int i = 0; int count = 0; //报数 1-3printf("请输入人数n\n");scanf("%d", &num);left_num = num;int array[num + 1]; //存放人员的号码for(i = 0; i <= num; i++) //0号无效array[i] = i; //1-num为人员号码i = 0;while(left_num > 1) //余下的人数大于1{i++;if(i > num)i = 1; //新的一轮 1-numif(array[i] != 0)count++; //报数if(count == 3){array[i] = 0; //报到3的人退出循环count = 0; //报数复位,再从1开始left_num--; //余下人数-1printf("%d号退出\n", i); //Debug}}for(i = 0; i <= num; i++)if(array[i] != 0)printf("最后留下的是%d号\n", i);return 0;
}
运行结果
网上参考
原文链接:.html
思路是一样的,毕竟这个方法简单直观。
// Created by www.runoob on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//#include <stdio.h>
void main()
{int num[50],n,*p,j,loop,i,m,k;printf("请输入这一圈人的数量:\n");scanf("%d",&n);p=num;//开始给这些人编号for (j=0;j<n;j++){*(p+j)=j+1;}i=0;//i用于计数,即让指针后移m=0;//m记录退出圈子的人数k=0;//k报数1,2,3while(m<n-1)//当退出的人数不大于总人数时,即留下的人数至少是一个人//这句不能写成m<n,因为假设有8人,当退出了6人时,此时还是进行人数退出,即m++,//这时是7<8,剩下的一个人自己喊1,2,3那么他也就退出了,将不会有输出{if (*(p+i)!=0)//如果这个人的头上编号不是0就开始报数加1,这里采用的方法是报数为3的人头上编号重置为0{k++;}if (k==3){ k=0; //报数清零,即下一个人从1开始报数*(p+i)=0;//将报数为3的人编号重置为0m++; //退出人数加1}i++; //指针后移if (i==n)//这句很关键,如果到了队尾,就要使指针重新指向对头//并且它只能放在i++后面,因为只有i++了才有可能i==n{i=0;}}printf("现在剩下的人是:");for (loop=0;loop<n;loop++){if (num[loop]!=0){printf("%2d号\n",num[loop]);}}}
更多推荐
C语言每日一练——第45天:n人围圈报数问题
发布评论