Coder Buct 1072: 資料結構作業(可選)-- 約瑟環問題
阿新 • • 發佈:2019-01-10
題目描述
將m個孩子從1到m編上號,按序號圍坐成一個圈,從1號孩子開始數,每數到n時,被數到的孩子即離開圈子,然後從下一個孩子開始,再從1開始數,如此不斷地數下去,只到只剩下最後一個孩子,問剩下的孩子是幾號?輸入
輸入為一組整數對,每個整數對佔一行,整數對的第一個整數表示m,即孩子的個數,第二個整數表示n,即被數到n的孩子將離開。 0<m<10000, n>0 輸入以0 0作為結束。輸出
每組整數對輸出一個結果整數,每個輸出佔一行。 最後一行輸入0 0不產生輸出。樣例輸入
8 35 20 0樣例輸出
73/*NO.1 (O(n) )演算法*/ #include <stdio.h> #include <math.h> int main() { int m, r; int i, j, s = 0; scanf("%d %d",&m, &r); for(i = 1; i <= m; i++) s = (s + r) % i; printf("%d\n",s + 1); return 0 ; } /*NO.2 陣列模擬*/ #include <stdio.h> #include <stdlib.h> #define MAX 10001 /*利用:求餘特性,(i+1)%m...*/ int main() { int a[MAX] = {0} ; int m, r, i, j, k, h; scanf("%d%d",&m, &r) ; k = 0; for(i = 1; i <= m; i++){ for(j = 0 ; ; ){ if(a[k] == 0){ j++; if(j < r) k = (k + 1) % m; else{ a[k] = 1; printf("%d\n",k+1); /*輸出正解*/ if(i != m) k = (k + 1) % m; break; } } else k = (k+1) % m ; } } printf("%d\n",k+1) ; return 0 ; } /*NO.3迴圈連結串列模擬*/ #include <stdio.h> #include <stdlib.h> typedef struct list { int num; struct list *next; }LIST; int main() { LIST *head = NULL, *p, *q; long i, j, k, m, r; scanf("%ld%ld", &m, &r) ; if(m <= 1){ printf("1"); return 0; } /*建立迴圈連結串列*/ p = (LIST *)malloc (sizeof(LIST)); p->num = 1; p->next = NULL; head = p; q = p; for(i = 2; i <= m; i++){ p = (LIST *)malloc (sizeof(LIST)); p->num = i; p->next = NULL; q->next = p; q = p; } q->next = head ; /*將最後一個結點的指向頭,這樣就構成了迴圈連結串列*/ p = head ; while (q->next != q){ for(i = 1; i < r; i++){ q = p; p = p->next; } q->next = p->next ; p = q->next ; } printf("%d\n", p->num); return 0 ; }