約瑟夫環(深圳大學oj題目)(適合初學者的講解方式)
阿新 • • 發佈:2019-02-06
題目描述
有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即為退出的人 ,在輸出最後一個,即為活下來的人。
*一定要記住計算的是很笨的,要讓他聽懂人話會讓你費勁,但他又很可愛,很好騙, 很多時候我們要實現的功能可以可以不從實質 上像要求的那樣去執行,可以偷工減料
的轉換,只要最後輸出一樣就好了。
程式碼實現:
{
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;
}
*************************** 這是本寶第一次寫的部落格,單純是為了在自己的修仙路上增加些樂子加深印象和方便以後複習, 有不對的請指正哦,不喜勿噴,要是喜歡請給我點贊,這也會給我這個苦逼可憐的狗狗多一些 動力呢。
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:要求打印出退出人的序號。以及找出最後留在圈子中的人原來的序號。既要標
功能實現:
1.當數到最後一個人的時候就減去n回到第一個人這樣就可以輕鬆實現迴圈
2.定義一個計數器 count,用陣列序號代表人,用1代表這個人活著,用0代表這個人 死了,當數到這個人的時候並且確定他是1活著的時候計數器就加一,每到3就將一個 人改為0,並且計數器減三,並且將這個人的序號放到一個新的陣列中去。 3.一直數直到所有人都為零的時候,才結束跳出,輸出新數列中的前n-1即為退出的人 ,在輸出最後一個,即為活下來的人。
*一定要記住計算的是很笨的,要讓他聽懂人話會讓你費勁,但他又很可愛,很好騙, 很多時候我們要實現的功能可以可以不從實質
程式碼實現:
-
- #include<stdio.h>
- int main()
- {
- int n,i,arr[20],brr[20],count,kill;
- scanf("%d",&n);
- for(int j=1;j<=n;j++)
- {
- arr[j]=1;
- }
- count=0,kill=0;
- for(i=1; ;i++) /*為了方便起見從陣列元素1用到n*/
- {
-
if(i==(n+1))
- i=1;
- if(arr[i]==1)
- {
- count++;
- if(count%3==0)
- {
- arr[i]=0;
- brr[kill]=i;
- kill++;
- if(kill==n)
- break;
- }
- }
- }
- for(int j=0;j<(n-1);j++)
- {
- printf("%d ",brr[j]);
- }
- printf("\n");
- printf("%d\n",brr[n-1]);
- return 0;
- }
{
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;
}
*************************** 這是本寶第一次寫的部落格,單純是為了在自己的修仙路上增加些樂子加深印象和方便以後複習, 有不對的請指正哦,不喜勿噴,要是喜歡請給我點贊,這也會給我這個苦逼可憐的狗狗多一些 動力呢。