テストコード|(c++)標準3052回:残り


に質問


2つの自然数AとBがある場合、AとBはAをBで割った残りの数である.例えば、7、14、27、38は3で除算され、残りは1、2、0、2である.
10個入力して42に分けて残りを求める.次にプログラムを作成し、いくつかの異なる値を出力します.
質問の表示

🎹入力


1行目から10行目まで、数字は1行1つです.この数字は1000以下で、非負の整数です.

📢しゅつりょく


最初の行を42で割ったとき、出力にはいくつの異なる残高がありますか.

ほどく

#include <iostream>
#include <vector>

using namespace std;

#define MAX 10
#define DIVIDEVALUE 42

int main() {

	int numbers[MAX];
	vector<int> remainingValues;

	
	for (int i = 0; i < MAX; i++)
	{
		// 수 10개 입력
		cin >> numbers[i];
		// 42로 나눈 나머지값을 저장
		remainingValues.push_back(numbers[i] % DIVIDEVALUE);
	}
	
	// 나머지 값들이 서로 중복되지 않는지 검사한다.
	int result = 0;
	bool isOverlap = false;
	for (int i = 0; i < remainingValues.size(); i++)
	{
		if (isOverlap == false) result++;

		for (int k = i + 1; k < remainingValues.size(); k++)
		{
			isOverlap = remainingValues[i] == remainingValues[k];
			if (isOverlap) break;
		}
	}

	// 서로 중복되지 않는 다른 값의 개수를 출력
	cout << result;

	return 0;
}
これは単純な問題であるが,アルゴリズム最適化と条件文の前後結果の違いに悩む時間があった.
異なる値間で重複しない個数を比較するために、これ以上比較する必要はないので、2番目のfor文の初期値を比較基準値の次の値に設定し、できれば対応するfor文割り込みキーワードを使用してfor文を終了します.

私が言ったのは難しいのではないでしょうか。


完成したら、この前のいくつかの問題を見て、基礎的な使用配列の問題で、答えが難しすぎるようです.だから他の人のコードを見て、簡単に解けました.だから添付ファイルを書き直します
#include <iostream>

using namespace std;

#define MAX 10

int main()
{
    int input;
    int container[42] = { 0 }; // 배열의 모든 요소들의 값을 0으로 초기화한다.
    int result = 0;
    for (int i = 0; i < MAX; i++)
    {
        cin >> input;
        container[input % 42]++;
    }
    for (int i = 0; i < 42; i++)
    {
        if (container[i] > 0) result++;
    }

    cout << result;

    return 0;
}
42の長さの配列を宣言し、入力値を42で割った残りの値をインデックスとして使用して要素の値を増やします.
次に、増加したデータを検索し、結果値を増加させるために再配置するという非常に簡単な解決策があります.

参考資料とサイト(ありがとうございます)

  • https://www.acmicpc.net/problem/3052