Josephus問題解決方法四(迴圈陣列)

Diy_os發表於2015-12-03
前幾篇都是運用了迴圈單連結串列的知識解決該問題(http://blog.itpub.net/29876893/viewspace-1815055/http://blog.itpub.net/29876893/viewspace-1850077/http://blog.itpub.net/29876893/viewspace-1851818/),下面用迴圈陣列來解決該問題。運用的解題思路和第三篇類似,給元素設定標識,退出迴圈的條件就是被標識的元素總數=學生總數。下面給出程式碼:

點選(此處)摺疊或開啟

  1. #include<iostream>
  2. #define MAX_SIZE 10
  3. using namespace std;
  4. int j,flag,q,sizeA;
  5. char lastone;
  6. void searchnote(char *,int);
  7. void searchnote(char *A, int n) {
  8.     cout << "出隊的順序依次是:" << endl;
  9.     for (int i = 0;i<=sizeA;i++){ //掃描陣列
  10.         
  11.         if (i == sizeA) { //如果迴圈整個陣列後,則取餘,構成迴圈陣列
  12.             i%=sizeA;
  13.         }
  14.         if(A[i] == NULL) {
  15.                 continue;
  16.             }
  17.          q++;
  18.             if (q == n) { //若q等於間隔數n,則此時A[i]就是被標識的元素,且q置為0
  19.                 cout << A[i]<< " ";
  20.                 flag++;
  21.                 if (flag == sizeA) { //該步驟是為了列印最後一個同學編號,否則最後一個同學別標識為NULL
  22.                     lastone = A[i];
  23.                  }
  24.                 A[i] = NULL;
  25.                 q = 0;
  26.             }
  27.             if (flag == sizeA) { //迴圈退出條件
  28.                 cout << endl;
  29.                 cout << "獲勝的同學是:" << endl;
  30.                 cout << lastone;
  31.                 break;
  32.             }
  33.     }
  34. }

  35. int main() {

  36.     cout << "請輸入同學的編號:" << endl;
  37.     char note[MAX_SIZE];
  38.     for (char ch; cin >>ch, j++) { //構建陣列
  39.         note[j] = ch;
  40.         cout << note[j] << " ";
  41.         sizeA++;
  42.     }
  43.     cout << endl;
  44.     searchnote(note, 4);
  45.     cout << endl;
  46. }
執行結果:

上面給出的只是解題思路,希望有拋磚引玉的作用,相信讀者還有更好的演算法。當然該程式有更多的功能可以完善,其中涉及到一些細節給出了簡單的註釋。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29876893/viewspace-1853008/,如需轉載,請註明出處,否則將追究法律責任。

相關文章