C++でnum + Rev(num) = 10^N − 1を満たすN桁の数の個数を求める方法
問題概要
整数Nが入力として与えられます。この記事の目的は、次の条件を満たすすべてのN桁の数の個数を求めることです。
num + rev(num) = 10N − 1
つまり、あるN桁の数と、その数字を逆順に並べ替えた数との和が、9がN個並んだ数(999…9)と等しくなるような数がいくつ存在するのかを数えます。
入力例
N=4
出力
num + Rev(num) = 10N − 1 を満たすN桁の数の個数 ― 90
説明
該当する数は以下の通りです ―
1. 1188 + 8811 = 9999
2. 2277 + 7722 = 9999
3. 1278 + 8721 = 9999
……合計90個
入力例
N=5
出力
num + Rev(num) = 10N − 1 を満たすN桁の数の個数 ― 0
説明
Nが奇数の場合、中央の桁は自分自身と足し合わされるため、その和が9になることはありません。したがって、条件を満たす数は存在せず、答えは0になります。
例:148 + 841 = 989
解法のアプローチ
任意のN桁の数について、その数と逆順の数との和が 10N − 1(=999…9、9がN個)になるのは、両者の対応する各桁のペアの和がすべて9になるときです。
- Nが奇数の場合:中央の桁は自分自身と足されるため、同じ数同士の和が9になることはありません。よって答えは0です。
- Nが偶数の場合:1桁目とN桁目、2桁目と(N−1)桁目、3桁目と(N−2)桁目…というように、対応する桁のペアの和がそれぞれ9である必要があります。可能なペアは (1+8)、(2+7)、(3+6)、(4+5)、(5+4)、(6+3)、(7+2)、(8+1)、(9+0) の9通りです。
したがって、答えは 9 × 10N/2 − 1 となります。
アルゴリズムの手順
- 整数Nを入力として受け取ります。
- 関数 digit_numbers(int N) は、num + Rev(num) = 10N − 1 を満たすN桁の数の個数を返します。
- カウントの初期値を0に設定します。
- Nが奇数の場合(N % 2 == 1)、0を返します。
- それ以外の場合は、count = 9 * pow(10, N/2 − 1) を計算します。
- countを結果として返します。
C++コード例
#include <bits/stdc++.h>
using namespace std;
int digit_numbers(int N){
int count = 0;
if (N % 2 == 1){
return 0;
} else {
count = 9 * pow(10, N/2 - 1);
}
return count;
}
int main(){
int N = 4;
cout<<"Count of all N digit numbers such that num + Rev(num) = 10^N - 1 are: "<<digit_numbers(N);
return 0;
}
出力
上記のコードを実行すると、次の出力が得られます ―
Count of all N digit numbers such that num + Rev(num) = 10^N - 1 are: 90
-
C++で1からnまでの数のうち、数字「4」を含む数を数える方法
このチュートリアルでは、1からnまでの整数の中に、数字「4」が含まれる数がいくつあるかを求めるプログラムについて解説します。具体的には、ある数nが与えられたとき、その範囲内で「4」という桁を少なくとも1つ持つすべての数を数え上げ、その個数を出力するのが目的です。アルゴリズムの考え方この問題はシンプルなアプローチで解くことができます。まず、1からnまでの各数値に対して、「4」という桁が含まれているかどうかを判定します。判定には、数値を10で割った余り(最下位の桁)を順番に確認していく方法を使います。もし余りが4であれば、その数には「4」が含まれていると判断できます。桁の確認が終わるまで、数値を1
-
C++で配列内の a % b = k を満たすすべてのペア(a, b)を検索する方法
問題の概要配列 A が与えられたとき、その中から a % b = k を満たすすべてのペア(a, b)を見つけることを考えます。たとえば、配列 A = [2, 3, 4, 5, 7]、k = 3 の場合、条件を満たすペアは (7, 4)、(3, 4)、(3, 5)、(3, 7) となります。ここで注意したいのは、(a, b) が順序付きペアであるという点です。つまり (3, 4) と (4, 3) は別々の候補として扱われ、それぞれ剰余演算の結果が k と一致するかどうかが個別に判定されます。解法のアプローチこの問題は、ブルートフォース(総当たり)法によって解くことができます。手順は以下のとお