您的位置:首页 > 编程语言 > C语言/C++

排成一圈数3退出最后一人位置问题--C语言谭浩强版练习8.5

2015-10-15 17:10 302 查看
有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 divisible by 3, take out of the team
if(flag%3==0)
manArray[i]='N';
}
}
return siteLast;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: