題目:輸入兩個正整數 n 和 m( (1<m<n<=50)),有 n 個人圍成一圈,按順序從 1 到 n 編號。從第一個人開始報數,報數 m 的人退出圈子,下一個人從 1 開始重新報數,報數 m 的人退出圈子。如此循環,直到留下最後一個人。請按退出順序輸出退出圈子的人的編號,以及最後一個人的編號。
- [www.linuxidc.com @test baoshu]$ more BaoShu.c
- #include <stdio.h>
- #include <malloc.h>
- /*********************************************************************
- *以循環隊列的數據結構實現
- *時間復雜度T(n)
- *采用循環隊列數據結構,使得每次對數組的訪問次數減少到最少
- **********************************************************************/
- int main(void)
- {
- int i=0,num=1,die=0,front,rear,temp=0;
- while(num!=0)
- {
- printf("\n輸入人數,小於零退出:");
- scanf("%d",&num);
- printf("\n輸入報到數:");
- scanf("%d",&die);
- int *cycle=(int *)malloc((num+1)*sizeof(int));
- for(i=0;i<=num;i++)
- {
- cycle[i]=i;
- }
- front=1;
- rear=num;
- i=1;
- while(front!=rear)
- {
- temp=(rear+1)%(num+1);
- cycle[temp]=cycle[front];
- front=(front+1)%(num+1);
- if(i==die)
- {
- i=1;
- printf("%d出隊\n",cycle[temp]);
- }
- else
- {
- i++;
- rear=(rear+1)%(num+1);
- cycle[rear]=cycle[temp];
- }
- }
- printf("幸存者是%d\n",cycle[front]);
- free(cycle);
- num=0;
- }
- return 0;
- }
-
- [www.linuxidc.com @test baoshu]$ gcc BaoShu.c -o BaoShu -Wall
- [www.linuxidc.com @test baoshu]$ ./BaoShu
-
- 輸入人數,小於零退出:9
-
- 輸入報到數:5
- 5出隊
- 1出隊
- 7出隊
- 4出隊
- 3出隊
- 6出隊
- 9出隊
- 2出隊
- 幸存者是8
- [www.linuxidc.com @test baoshu]$