排成一圈数3退出最后一人位置问题--C语言谭浩强版练习8.5
程序员文章站
2022-07-07 22:34:00
有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号位置
/**************...
有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号位置
/******************************************************
E8.5
Plan:可以不循环喊1到3,用总数是不是3的倍数代替
CREATE----------------------------
By: Idooi Liu
Time: 2015/10/15-1500
----------------------------------
******************************************************/
#include <stdio.h> #include <stdlib.h> int expThree(int n, int manArray[]); int main(void) { int nMan; //How many people char *pMan; //The array int siteLast; //The last person's site int i; printf("Please input how many people:\n"); scanf("%d", &nMan); pMan=malloc(nMan*sizeof(char)); //Assignment for(i=0; i<nMan; i++) *(pMan+i)='Y'; siteLast=expThree(nMan, pMan); printf("The last one\'s site is %d\n", siteLast); free(pMan); return 0; } int expThree(int n, int manArray[]) { int i, j; int siteLast; //The last person's site int flag=0; //Count off int k; for(i=0; i<n; i++) { k=0; //For check how many people last for(j=0; j<n; j++) { if(manArray[j]=='Y') k++; siteLast=j; } if(k==1) //Only one person break; if(manArray[i]=='Y') { flag++; //The person who in the team take the next number //If the person's number is pisible by 3, take out of the team if(flag%3==0) manArray[i]='N'; } } return siteLast; }
上一篇: SQLserver函数运用实例
下一篇: 误删除Oracle数据库数据该如何恢复?