【C++】最初の桁と最後の桁が一致する数値を範囲内から数える方法
start から end までの数値の範囲が与えられたとき、その範囲 [start, end] 内に含まれる「最初の桁(先頭の桁)と最後の桁(一の位)が一致する」数値の個数を求めるのが本記事の目的です。
なお、1桁の数値は先頭と末尾の桁が必然的に同じになるため、範囲内に存在すればすべてカウント対象となります。
例で理解しよう
入力: start = 100, end = 200
出力: 最初の桁と最後の桁が一致する範囲内の数値の個数: 10
説明: 該当する数値は以下の10個です。
101, 111, 121, 131, 141, 151, 161, 171, 181, 191
入力: start = 1, end = 10
出力: 最初の桁と最後の桁が一致する範囲内の数値の個数: 9
説明: 1桁の数値はすべて該当するため、1, 2, 3, 4, 5, 6, 7, 8, 9 の9個がカウントされます。10 は先頭の桁が「1」、末尾の桁が「0」で一致しないため対象外です。
プログラムで使用するアプローチ
まず、範囲 [start, end] 内に存在する1桁の数値はすべてカウントします。次に、各数値について先頭の桁と末尾の桁を比較します。先頭の桁が末尾の桁より大きい場合は count に「8 + val/10」を加算し、小さい場合は「9 + val/10」を加算します。ここで val は関数 range(int val) の再帰呼び出しにおける現在の数値です。
- 整数 start と end を範囲の変数として受け取ります。
- count = range(end) - range(start) を計算します。
- 関数 range(int val) は整数を受け取り、先頭の桁と末尾の桁が一致する数値の個数を返します。
- 初期の count を 0 とします。
- 末尾の桁は val % 10 で求めます。
- val が1桁の数値(10未満)の場合は val をそのまま返します。
- while ループを使って start = val % 10 を計算し、val を 10 で割り続けることで、start に先頭の桁を格納します。
- start <= end の場合は、count に 9 + set_val / 10 を加算します。
- start > end の場合は、count に 8 + set_val / 10 を加算します。
- 最後に count を結果として返します。
コード例
#include <iostream>
using namespace std;
int range(int val) {
int count = 0;
int start;
int end = val % 10;
int set_val = val;
if (val < 10) {
return val;
}
end = val % 10;
while (val) {
start = val % 10;
val = val / 10;
}
if (start <= end) {
count = 9 + set_val / 10;
} else {
count = 8 + set_val / 10;
}
return count;
}
int main() {
int start = 10, end = 50;
int count = range(end) - range(start);
cout << "Count of Numbers in Range where first digit is equal to last digit of the number are: " << count;
return 0;
}
上記のコードを実行すると、次の出力が得られます。
出力
Count of Numbers in Range where first digit is equal to last digit of the number are: 4
説明: 範囲 [10, 50] 内で先頭の桁と末尾の桁が一致する数値は 11, 22, 33, 44 の4つであるため、結果は 4 となります。
-
C++で最小の約数がKとなる範囲内の数値を数える方法
本チュートリアルでは、指定された範囲内にある数値のうち、「最小の約数(最小の素因数)」が K と一致するものの個数を求めるC++プログラムについて解説します。 問題の概要 範囲 [a, b] と整数 K が与えられたとき、この範囲に含まれる数値の中で「最小の約数が K であるもの」を数えるのが目的です。 ある数 n の最小の約数が K になるためには、次の2つの条件を満たす必要があります。 n が K で割り切れること 2 以上 K 未満のいずれの整数でも n が割り切れないこと また重要な点として、K が素数でない場合、条件を満たす数は存在しません(合成数が「最小の約数」となることはな
-
配列の要素の積の最初の桁を求めるC++プログラム
はじめにこの記事では、与えられた配列のすべての要素を掛け合わせた積の、最初の桁(最上位の桁)を求めるプログラムについて解説します。例として、次のような配列が与えられたとします。arr = {12, 5, 16}これらの要素の積は、12 × 5 × 16 = 960 となります。したがって、求める結果、つまり積の最初の桁は「9」になります。アルゴリズム変数 prod を 1 で初期化するループを使い、配列の各要素を順番に prod に掛けていくprod が 10 以上である間、prod を 10 で割り続ける残った一桁の値が、積の最初の桁となるサンプルコード#include <bits/s