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

C++で先頭と末尾の桁が同じ数字になる数を数える方法

区間 [first, last] が与えられたとき、この範囲内で「先頭の桁」と「末尾の桁」が同じ数値がいくつ存在するかを求めるのが本記事の目的です。例えば 232 という数値は、先頭の桁も末尾の桁も 2 で一致しています。

この問題は、i = first から i = last まで順番に走査することで解決できます。各数値について先頭の桁と末尾の桁を比較し、両者が一致していればカウントを1つずつ増やしていきます。

それでは、具体的な例で確認してみましょう。

入力 − first = 8, last = 40

出力 − 先頭と末尾の桁が同じ数値の個数:5

説明 − 8 から 40 の間で先頭と末尾の桁が同じ数値は以下の通りです。

8, 9, 11, 22, 33

入力 − first = 100, last = 200

出力 − 先頭と末尾の桁が同じ数値の個数:10

説明 − 100 から 200 の間で先頭と末尾の桁が同じ数値は以下の通りです。

101, 111, 121, 131, 141, 151, 161, 171, 181, 191

プログラムで使用するアプローチ

  • 2つの整数 first と last を受け取り、探索範囲 [first, last] を定義します。

  • 関数 getFirstDigit(int num) は、渡された数値の先頭の桁を返します。

  • num >= 10 の間、num を 10 で割り続けます。ループが終わった時点で num には先頭の桁のみが残っているため、その値を返します。例えば num = 232 なら、232 → 23 → 2 と変化し、先頭の桁である 2 が得られます。

  • 関数 getCount(int fst, int lst) は範囲を受け取り、先頭と末尾の桁が一致する数値の個数を返します。

  • カウントの初期値を 0 に設定します。

  • for ループで i = fst から i = lst まで繰り返し、各 i に対して getFirstDigit(i) を呼び出して先頭の桁を fdigit に格納します(fdigit = getFirstDigit(i))。

  • 末尾の桁は剰余演算を用いて ldigit = i % 10 として求めます。

  • fdigit == ldigit であれば両者の桁は一致しているため、カウントを増やします。

  • ループ完了後、カウントを結果として返します。

サンプルコード

#include <bits/stdc++.h>
using namespace std;
// 先頭の桁を求める
int getFirstDigit(int num){
   while (num >= 10)
      { num = num / 10; }
   return num;
}
int getCount(int fst,int lst){
   int count=0;
   for(int i=fst;i<=lst;i++){
      int fdigit=getFirstDigit(i);
      int ldigit=i%10; // 末尾の桁を取得
      if(fdigit==ldigit) // 両者が一致していればカウントを増やす
         { ++count; }
   }
   return count;
}
int main(){
   int first = 10, last = 23;
   cout<<"Numbers with same first and last digits:"<<getCount(first, last);
   return 0;
}

実行結果

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

Numbers with same first and last digits:2

計算量について

このアルゴリズムは区間内の各数値を一度ずつ調べるため、時間計算量は O(n × d) となります(n は区間の幅、d は各数値の桁数)。先頭の桁の取得は数値を 10 で割り続けるだけ、末尾の桁の取得は 10 で割った余りを求めるだけで実現できるため、非常にシンプルで効率的な実装となっています。

  1. C++で偶数の位と奇数の位の合計の絶対差が1となるn桁の数をすべて出力する方法

    問題の概要この問題では、整数 n が与えられ、「偶数の位にある桁の合計」と「奇数の位にある桁の合計」の絶対差が 1 となるすべての n 桁の数を出力することが求められます。なお、数を生成する際に先頭の 0 は考慮しません(先頭が 0 のものは n 桁の数として扱いません)。ここでいう絶対差とは、2つの値の差の絶対値(常に正の値)を意味します。具体例を使って、問題を理解しましょう。入力: n = 2 出力: 10 12 21 23 32 34 43 45 54 56 65 67 76 78 87 89 98 説明: 出力の中の数を例にとると、 54 の場合 → 偶数の位 − 奇数の位 = 5 −

  2. C++で配列要素の積の下位k桁を求める方法

    n個の要素を持つ配列Aと数値kが与えられたとき、配列内のすべての要素の積の下位k桁を求める問題を考えてみましょう。例えば、A = [15, 22, 13, 19, 17] の場合、各要素の積は 1385670 となります。ここで k = 3 とした場合、求めるべき下位3桁は「670」です。解法のアプローチこの問題を効率的に解くには、要素を掛け合わせる際に 10k を法として剰余を取りながら計算します。通常、配列の要素数が増えると積は急激に巨大化し、整数型のオーバーフローを引き起こす可能性があります。しかし、10k で割った余りだけを保持すれば、積がどれほど大きくなっても、必要な下位k桁を正確に