題目:有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下的是原來第幾號的那位。
程序分析:無。
程序源代碼:
// Created by www.runoob.com on 15/11/9. // Copyright © 2015年 菜鳥教程. All rights reserved. // #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號