可以在程序執行過程中,對數組作動態賦值。這時可用循環語句配合 scanf 函數逐個對數組元素賦值。
求解問題:100人圍坐一圈并按順時針方向依次編號為0,1,...,99。并沿順時針方向依次報數1,2,3,...k。報數為k的人退出。剩下的人繼續從1開始報數。最后留下的是幾號?k從鍵盤輸入。
輸入:3
輸出:90
【案例分析】
求解問題的基本思路是:
1、用數組作刪除標記:int a[100]={0};
2、未作刪除標記的編號循環報號,報到k的編號i作刪除標記:a[i]=1;
3、每作一個刪除標記,人數減1。直到余下最后一人。
【參考代碼】
main()
{ int i=0,h=0,n=100,k,a[100]={0};
scanf("%d",&k);
while(n>1) //人數n>1時,繼續報號
{ if(a[i]==0) //編號i未作刪除標記
{ h++; //報號
if(h==k){h=0;a[i]=1;n--;} //報到k號,作刪除標記
}
i=(i+1)%100; //下一個編號
}
for(i=0;i<100;i++) //找出未作刪除標記的編號
if(a[i]==0){printf("%d",i);break;}
}
/*方法二思路:退出1個人后從其后的人開始重新編號0,1,...
則編號x的上一個編號為(x+k)%n(n為當前編號時的總人數+1)。
問題轉化為:最后余下的編號0的起始編號是多少?
參考代碼:
main()
{ int i,k,s=0;
scanf("%d",&k);
for(i=1;i<100;i++)
s=(s+k)%(i+1);
printf("%d",s);
}*/
評論列表