7-1 約瑟夫環(Josephus)問題(by Yan) (100分)
編號為1,2,…,n的n個人按順時針方向圍坐在一張圓桌周圍,每人持有一個密碼(正整數),一開始任選一個正整數m作為報數上限值,從第一個人開始按順時針方向自1開始報數,報到m時停止報數,報m的那個人出列,將他的密碼作為新的m值,從他順時針方向的下一個人開始重新從1報數,數到m的那個人又出列;如此下去,直至圓桌周圍的人全部出列為止,要求按出列順序輸出n個人的編號,
輸入格式:
第一行輸入兩個整數,依次表示人數n和初始化密碼m,以空格間隔, 第二行依次輸入n個整數,分別表示n個人的密碼,以空格間隔,
輸出格式:
按出列次序輸出每個人的編號,以空格間隔,
輸入樣例:
在這里給出一組輸入,例如:
7 20
3 1 7 2 4 8 4
輸出樣例:
在這里給出相應的輸出,例如:
6 1 4 7 2 3 5
我的認識
我對PTA的一些總結:
(1).PTA對輸出格式要求非常高
(2).如果遇到在編譯器答案能正常輸出,在PTA上是答案錯誤,這時你要試著在scanf陳述句之后增加getchar陳述句或者檢查是否是自己的代碼有些地方是真的沒有考慮到,
代碼部分(如有那處不懂,歡迎在下方留言,我會盡早回復,若代碼有問題,請指出)
代碼如下:
#include <stdio.h>
#include <malloc.h>
typedef struct set{
int password;
int num;
struct set * next;
}Node;
int main (void)
{ int n,m;
int i,j = 1,k=1;
int flag = 1;
int a[1000];
Node head,*phead,*p0,*p1;
phead = NULL;
scanf("%d %d",&n,&m);
getchar();
//創建鏈表的部分
//創建的是一個回圈鏈表
for (i = 0;i<n;i++){
if(phead == NULL){
phead = &head;
phead->num = j;//存編號
p0 = phead;
phead->next = phead;
}
else{
p1 = (Node*)malloc(sizeof(Node));//動態創建一個結構體
p1->next = p0;
phead->next = p1;
phead = p1;
phead->num = j;
}
scanf("%d",&phead->password);
j++;//更新編號
}
i = 0;
//思路,回圈到編號num處,則將其編號存入一個陣列中
//然后把編號的值改為0,繼續進行回圈
//退出條件:陣列的元素個數和鏈表的個數相等
while(p0){
if(p0->num == 0){
p0 = p0->next;
continue;
}
if(k == m && p0->num!= 0){
a[i] = p0->num;
m = p0->password;
p0->num = 0;
i++;
k = 0;
}
k++;
if(i == (j - 1))
break;
p0 = p0->next;
}
//輸出部分
for(j = 0;j<i;j++)
printf("%d ",a[j]);
}
本次分享到此結束,謝謝!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/128716.html
標籤:其他
上一篇:【Unity學習歷程之五】在unity中使用C#快速簡單地實作定時:Coroutine(協程)
下一篇:零基礎掌握Python入門到實戰
