1. 程式人生 > >約瑟夫環(深圳大學oj題目)(適合初學者的講解方式)

約瑟夫環(深圳大學oj題目)(適合初學者的講解方式)

題目描述 有n個人圍成一個圈,從第一個人開始順序報號1,2,3。凡是報到
3退出圈子中的人原來的序號。要求打印出退出人的序號。以及找出
最後留在圈子中的人原來的序號。
輸入
n
輸出
退出人的序號,並找出最後留在圈子裡的人原來的序號
樣例輸入
13

樣例輸出
3 6 9 12 2 7 11 4 10 5 1 8 13

讀題分析出要實現的功能開始建模:
1:有n個人圍成一個圈,既要實現迴圈報數。
2:從第一個人開始順序報號1,2,3。凡是報到3退出圈子中的人原來的序號。
既要用到一個1,2,3迴圈的計數器,同時要讓數到三的人不在被數到(不一定要
真的將這個資料從陣列中刪掉)
3:要求打印出退出人的序號。以及找出最後留在圈子中的人原來的序號。既要標
記被數到3的人,或者是將它們放在一個新的數組裡

功能實現:
1.當數到最後一個人的時候就減去n回到第一個人這樣就可以輕鬆實現迴圈
2.定義一個計數器 count,用陣列序號代表人,用1代表這個人活著,用0代表這個人
死了,當數到這個人的時候並且確定他是1活著的時候計數器就加一,每到3就將一個 人改為0,並且計數器減三,並且將這個人的序號放到一個新的陣列中去。 3.一直數直到所有人都為零的時候,才結束跳出,輸出新數列中的前n-1即為退出的人 ,在輸出最後一個,即為活下來的人。

*一定要記住計算的是很笨的,要讓他聽懂人話會讓你費勁,但他又很可愛,很好騙,
很多時候我們要實現的功能可以可以不從實質
上像要求的那樣去執行,可以偷工減料 的轉換,只要最後輸出一樣就好了。
程式碼實現:
    1. #include<stdio.h>
    2. int main()  
    3. {  
    4.     int n,i,arr[20],brr[20],count,kill;  
    5.     scanf("%d",&n);  
    6.     for(int j=1;j<=n;j++)  
    7.     {  
    8.         arr[j]=1;  
    9.     }  
    10.     count=0,kill=0;  
    11.     for(i=1; ;i++) /*為了方便起見從陣列元素1用到n*/
    12.     {  
    13.         if(i==(n+1))  
    14.         i=1;  
    15.         if(arr[i]==1)  
    16.         {  
    17.         count++;  
    18.         if(count%3==0)  
    19.         {  
    20.         arr[i]=0;  
    21.         brr[kill]=i;  
    22.         kill++;  
    23.         if(kill==n)  
    24.         break;  
    25.         }  
    26.         }  
    27.     }  
    28.     for(int j=0;j<(n-1);j++)  
    29.     {  
    30.         printf("%d ",brr[j]);  
    31.     }   
    32.     printf("\n");  
    33.     printf("%d\n",brr[n-1]);  
    34.     return 0;  
    35. }  
    /*中間可以先寫成多個if的分支結構再根據邏輯關係整合起來這樣寫的時候比較不容易亂哦*/
for(i=1; ;i++)
{
if(arr[i]==1)
{
count++;
}
if(count%3==0)
{
arr[i]=0;
brr[kill]=i;
kill++;
}

if(i==n)
i=i-n;

if(kill==n)
break;
}

*************************** 這是本寶第一次寫的部落格,單純是為了在自己的修仙路上增加些樂子加深印象和方便以後複習, 有不對的請指正哦,不喜勿噴,要是喜歡請給我點贊,這也會給我這個苦逼可憐的狗狗多一些 動力呢。