先寫我的思路,沒有用指針的做法。如果你用的是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);
