OJブラシ質問記録:ジョセフリング質問質問番号:657

ジョセフリング質問タイトル番号:657

質問の要件:
1、2、...、nの番号が付けられたn人がサークルを形成し、パスワードmが与えられ、最初に番号を報告した人から始め、mを報告して番号を停止し、mを報告した人がサークルから出ます、次に、次のカウントからカウントを再報告し、mに報告したらカウントを停止し、mがラップから外れたことを報告します...、全員がラップから外れるまで、次のように続けます。キーボードでnとmの値を入力します。円から出て行くn人のシーケンスを出力するようにプログラムを設計してください。

入力の説明
入力する人の数nは初期円で、1行を占めます。
パスワードを入力mを、1ライン分を占有
出力説明。
出力サークルを残し、n個の人々のため、スペースで区切って、スペースは最後の要素の後にあります。
入力例
10
3
の出力例
3 6 9 2 7 1 8 5 10 4

問題解決のアイデア:
重要なポイントはアレイをループすることであり、チームを去った人々は判断を下していません。
まず、入力nの総数を使用して、長さnの配列を宣言し、配列内の要素を1〜nに割り当てます。アレイを端から端までループします。現在のカウントを報告している人の位置を記録するカウンターカウントを定義します。mに等しい場合は、配列要素を出力します。このとき、次の人が次の人からカウントを再開するため、カウンターカウントを0にリセットします。配列要素の値を-1に割り当てます。これは、人がデキューされたことを意味し、人の総数nも1減少します。次のサイクルで-1が検出された場合は、続行し、それ以上の判断は行いません。nが0になるまで、ループを終了します。デキューシーケンス出力が完了しました。
アレイループループトラバーサルの実装:
ループ変数インデックスを使用します。インデックスがアレイの最大添え字値よりも小さい場合、インデックスは1増加してからトラバースされます。インデックスがアレイの最大添え字値以上の場合は、最大添え字の残りを取得します。配列が円形のときに到達する必要がある添え字値を計算します。

通関コード:

#include <iostream>

using namespace std;

int main() {
    
    
	int n, m, count = 0, index = 0;
	
	cin >> n >> m;
	
	const int LEN = n;
	int arr[LEN];
	
	for (int i = 0; i < LEN; i++) {
    
    
		arr[i] = i + 1;
	}
	
	while (n > 0) {
    
    
		if (index >= LEN) {
    
    
			index = index % LEN;
		}
		
		if (arr[index] != -1) {
    
    
			count++;
		}
		if (count == m) {
    
    
			count = 0;
			cout << arr[index] << ' ';
			arr[index] = -1;
			n--;
		}
		
		index++;
	}
	
	return 0;
} 

コンプリート。

おすすめ

転載: blog.csdn.net/weixin_45711556/article/details/108571525