pta演習8-4は数を報告します

思考の問題で行き詰まった水問題

オリジナルタイトルリンク

トピック

カウントゲームは次のようになります。円の中にはn人がいて、番号は1からnまで順番に番号が付けられています。最初の人から数え始め、m(<n)に報告する人は円から出ます。次の人は1から数え始め、mに報告する人は円から出ます。これは最後の人が去るまで続きます。

この質問では、各人の出口注文番号を指定して関数を作成する必要があります。

関数インターフェースの定義

void CountOff(int n、int m、int out []);

ここで、nは初期の人数、mはゲームで指定された終了順序です(n未満の正の整数であることが保証されています)。関数CountOffは、配列out []内の各人の終了順序番号を格納します。C言語配列の添え字は0から始まるため、i番目の位置にいる人はout [i-1]番目の出口にいます。

審判のテスト手順の例

#include <stdio.h>
#define MAXN 20

void CountOff( int n, int m, int out[] );

int main()
{
    
    
    int out[MAXN], n, m;
    int i;

    scanf("%d %d", &n, &m);
    CountOff( n, m, out );   
    for ( i = 0; i < n; i++ )
        printf("%d ", out[i]);
    printf("\n");

    return 0;
}

/* 你的代码将被嵌在这里 */

入力サンプル

11 3

サンプル出力

4 10 1 7 5 2 11 9 3 6 8

この質問に陥りやすい考え方の誤解は、出力が順番に排除された人の数であると誤って信じることであり(つまり、サンプル出力は3、6、9 ...である必要があります)
、実際の出力は対応する番号が削除されたラウンド数になります(出力サンプルのうち、1、2、3はラウンド数を表し、最初のラウンドで3番の人の削除を表し
ます。など)はるかに簡単になります。出力原理を理解するために〜

コード:


void CountOff( int n, int m, int out[] )
{
    
    

    int j=0,count=0,item=0;
    for(int i=0;i<n;i++)
		out[i]=0;//数组初始化
    while(1){
    
    
		if(out[j++]==0)
			count++;
		if(count==m){
    
    
	    	item++;
			out[j-1]=item;
			count=0;
		}
		if(item==n)
			break;//当仅剩最后一人时 跳出while循环
		j=j%n;
	}
}

おすすめ

転載: blog.csdn.net/laysan/article/details/114960606