C 練習實例69
題目:有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下的是原來第幾號的那位。
程式分析:無。
實例
// Created by www.xuhuhu.com on 15/11/9.
//
//
#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,3
while(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的人編號重置為0
m++; //退出人數加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]);
}
}
}
以上程式執行輸出結果為:
請輸入這一圈人的數量: 8 現在剩下的人是: 7號