C 練習(xí)實(shí)例69

C 語言經(jīng)典100例 C 語言經(jīng)典100例

題目:有n個(gè)人圍成一圈,順序排號(hào)。從第一個(gè)人開始報(bào)數(shù)(從1到3報(bào)數(shù)),凡報(bào)到3的人退出圈子,問最后留下的是原來第幾號(hào)的那位。

程序分析:無。

程序源代碼:

//  Created by hgci.cn on 15/11/9.
//  Copyright © 2015年 W3Cschool教程. All rights reserved.
//

#include <stdio.h>
void main()
{
    int num[50],n,*p,j,loop,i,m,k;
    printf("請(qǐng)輸入這一圈人的數(shù)量:\n");
    scanf("%d",&n);
    p=num;
    //開始給這些人編號(hào)
    for (j=0;j<n;j++)
    {
        *(p+j)=j+1;
    }
    i=0;//i用于計(jì)數(shù),即讓指針后移
    m=0;//m記錄退出圈子的人數(shù)
    k=0;//k報(bào)數(shù)1,2,3
    while(m<n-1)//當(dāng)退出的人數(shù)不大于總?cè)藬?shù)時(shí),即留下的人數(shù)至少是一個(gè)人
        //這句不能寫成m<n,因?yàn)榧僭O(shè)有8人,當(dāng)退出了6人時(shí),此時(shí)還是進(jìn)行人數(shù)退出,即m++,
        //這時(shí)是7<8,剩下的一個(gè)人自己喊1,2,3那么他也就退出了,將不會(huì)有輸出
    {
        if (*(p+i)!=0)//如果這個(gè)人的頭上編號(hào)不是0就開始報(bào)數(shù)加1,這里采用的方法是報(bào)數(shù)為3的人頭上編號(hào)重置為0
        {
            k++;
        }
        if (k==3)
        {    k=0;    //報(bào)數(shù)清零,即下一個(gè)人從1開始報(bào)數(shù)
            *(p+i)=0;//將報(bào)數(shù)為3的人編號(hào)重置為0
            m++;    //退出人數(shù)加1
        }
        i++;      //指針后移
        if (i==n)//這句很關(guān)鍵,如果到了隊(duì)尾,就要使指針重新指向?qū)︻^
            //并且它只能放在i++后面,因?yàn)橹挥衖++了才有可能i==n
        {
            i=0;
        }
        
        
    }
    printf("現(xiàn)在剩下的人是:");
    for (loop=0;loop<n;loop++)
    {
        if (num[loop]!=0)
        {
            printf("%2d號(hào)\n",num[loop]);
        }
    }
    
}

以上程序執(zhí)行輸出結(jié)果為:

請(qǐng)輸入這一圈人的數(shù)量:
8
現(xiàn)在剩下的人是: 7號(hào)

C 語言經(jīng)典100例 C 語言經(jīng)典100例