C++ プログラミング

5つの数字を並べ替えて最大の5桁を作る(C++)

問題

1〜9 の数字 A,B,C,D,E が与えられる。
この5つを好きな順番で並べて繋げて作れる 5桁の整数のうち最大を求めよ。


考え方(最短で理解)

最大にするには、左の桁ほど大きい数字を置くという考え方がシンプルです。

つまり

  • 5つの数字を 降順(大きい順)にソート
  • その順に並べて繋げる

これで必ず並べた数字が最大になります。

C++ 解法

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    int A, B, C, D, E;
    cin >> A >> B >> C >> D >> E;

    vector<int> v = {A, B, C, D, E};
    sort(v.begin(), v.end(), greater<int>());

    int ans = 0;
    for (int x : v) {
        ans = ans * 10 + x;
    }

    cout << ans << '\n';
    return 0;
}

1行ずつ解説

#include <bits/stdc++.h>

AtCoderでよく使う「全部入りヘッダ」。これ1行で多くの標準機能が使える。

using namespace std;

std:: を毎回書くのを省略する。

int main() {

プログラムの開始地点。

    int A, B, C, D, E;

5つの数字を入れる変数を用意。

    cin >> A >> B >> C >> D >> E;

入力を受け取る。

    vector<int> v = {A, B, C, D, E};

5つの数字を vector にまとめる(並べ替えしやすくするため)。

    sort(v.begin(), v.end(), greater<int>());

v を **降順(大きい順)**にソートする。
これで左の桁に大きい数字が来るので最大になる。

    int ans = 0;

答えとなる数を作るための変数(最初は0)。

    for (int x : v) {

降順に並んだ v を左から順番に取り出す。

        ans = ans * 10 + x;

今の数を10倍して1桁左にずらし、次の数字 x を足す。
例:ans=98x=7 なら 98*10+7=987

    }

ループ終了。

    cout << ans << '\n';

答えを出力。

    return 0;
}

終了!って感じです。

補足:なぜ降順が最適?

5桁の数は左の桁ほど影響が大きいです。

  • 9xxxx はどんな 8xxxx より必ず大きい
  • だから 一番大きい数字を一番左に置く
  • 次に大きい数字を2桁目へ…

なので、並べ替えの最大は「降順ソート」一発で決まります。

-C++, プログラミング

Copyright© donguri.pyのblog , 2026 All Rights Reserved.