先寫我的思路,沒有用指針的做法。如果你用的是VC,把第六行去掉。
#include<stdio.h> #include<stdlib.h> int main() { setvbuf(stdout,NULL,_IONBF,0); int n,num; //n為總人數,num為剩余人數。 int a[255]={0}; //用0標記此位置有人,若此位置的人退出,則該位置的值為1 int i; int flag=0; //flag為報數 printf("How many people?"); scanf("%d",&n); num=n; //剩余人數初始為n while(num!=1) //剩余人數為1時,停止循環 { for(i=0;i<n;i++) { if(a[i]==0) //若該位置有人,就報數 flag++; if(flag==3) //若報數為3,此人退出 { flag=0; a[i]=1; num--; } } } for(i=0;i<n;i++) //遍歷數組,第一個值為0的位置處就是剩余的人了 { if(a[i]==0) { printf("The remaining person is NO.%d.",i+1); //數組的序號從0算起,而人的編號從1算起,所以有+1的修正 break; } } return EXIT_SUCCESS; }
參考答案的算法基本和我的差不多
區別有:
1 每個位置上剛開始賦值為每個人的編號1-n,有人退出后,該人的位置賦值為0;
2 把每個用數組形式表示的a[i]轉換為*(p+i),p當然事先定義並賦值為p=a,不過這個區別不是很大哈。
最后一個循環可以用while來實現,很是簡潔:
i=0;
while(a[i]==1)
i++;
printf("The remaining person is NO.%d.",i+1);