欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-14 08:24:30
有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;
}