C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で指定された数値の最小の桁を見つけるプログラムの書き方

負でない整数が与えられたとき、その数値を構成する各桁の中から最小の数字を見つけるのが本記事の課題です。

入力:

N = 154870

出力:

0

説明: 入力された数値「154870」には 1・5・4・8・7・0 の6つの桁が含まれており、その中で最も小さいのは「0」です。

解き方のアプローチ

この問題を解く最もシンプルな方法は、剰余演算(% 演算子)を使って末尾の桁を1つずつ取り出しながら数値を走査し、取り出した桁が現在の最小値より小さければ最小値を更新していくというものです。

  • 整数 n を入力として受け取ります。
  • 関数 smallest_digit(int n) は引数 n を受け取り、その数値に含まれる最小の数字を戻り値として返します。
  • まず変数 min を、数値の末尾の桁(n % 10)で初期化します。
  • n を 10 で割りながら残りの桁を順番に調べ、取り出した桁が現在の最小値より小さければ min を更新します。
  • n /= 10 によって末尾の桁を削除し、さらに小さい桁が存在するかどうかを確認します。
  • n が 0 になった時点でループを終了し、求めた最小値を返します。

このアルゴリズムの計算量は O(log₁₀ n)、つまり数値の桁数に比例した時間で処理が完了するため、非常に効率的です。

C++での実装例

#include <iostream>
using namespace std;

int smallest_digit(int n) {
    int min = n % 10; // 末尾の桁が最小であると仮定
    n /= 10;          // 後ろから2桁目から処理を開始
    while (n != 0) {
        if (min > n % 10)
            min = n % 10;
        n /= 10;
    }
    return min;
}

int main() {
    int n = 154870;
    cout << smallest_digit(n);
    return 0;
}

上記のコードを実行すると、次の出力が得られます。

出力

0

説明: 数値「154870」の中で最小の桁は「0」であるため、プログラムは 0 を出力します。

  1. C++で指定した範囲内の「各桁がすべて異なる」整数を検索する方法

    この記事では、2つの整数 l と r が与えられたとき、その範囲(両端を含む)に存在する「各桁の数字がすべて異なる」整数 x を見つけるC++のプログラムを紹介します。 例えば、入力が l = 211、r = 230 の場合、出力は 213 となります。211は「1」が重複しているため条件を満たしませんが、213は各桁(2・1・3)がすべて異なるため有効な答えです。 解法のアプローチ この問題は、以下の手順で解くことができます。 l から r までの各整数 k を順番に調べます。 k を文字列に変換します。 文字列の各文字(桁)をセット(set)に挿入します。セットは重複を許さないため、同

  2. 【C++】グラフ内の橋(ブリッジエッジ)の数を検出するプログラムの解説

    ブリッジエッジ(橋)とは? 重みなし無向グラフにおけるブリッジエッジ(橋)とは、その辺を取り除いたときにグラフが非連結(複数の連結成分に分断される)となるような辺のことです。本記事では、n個の頂点とm個の辺からなるグラフが与えられたとき、その中に含まれるブリッジの数を求めるC++プログラムを紹介します。なお、対象となるグラフには平行辺や自己ループは含まれないものとします。 問題の例 例として、n = 5、m = 6、edges = {{1, 2}, {1, 3}, {2, 3}, {2, 4}, {2, 5}, {3, 5}} という入力が与えられた場合を考えてみましょう。この場合の出力は