【C++】Nの各桁の数字からASCII値を構成できるアルファベットの個数を求める方法
正の整数を格納したlong型変数が入力として与えられます。この問題の目的は、入力された数値の各桁の数字を組み合わせて、英字アルファベットのASCII値を構成できる個数を求めることです。
数値から任意の2つの桁を選び、それらを並べることで英字アルファベットのASCII値を作ります。大文字A〜ZのASCII値は65〜90、小文字a〜zのASCII値は97〜122です。
対象となるアルファベットの総数は26+26=52個となります。
例で理解しよう
入力 − N_digits = 163465
出力 − Nの桁からASCII値を形成できるアルファベットの数: 2
説明 − 163465に含まれるASCII値は65と66のみです。したがって、作成可能なアルファベットは2つだけです。
入力 − N_digits = 902349
出力 − Nの桁からASCII値を形成できるアルファベットの数: 2
説明 − 902349に含まれるASCII値は90と99のみです。したがって、作成可能なアルファベットは2つだけです。
プログラムで使用するアプローチ
このアプローチでは、まず入力された数値の各桁の出現回数を格納する頻度配列total[10]を作成します。次に、65〜90および97〜122の範囲内の各数値iについて、iの各桁を取り出して頻度配列内を検索します。iのすべての桁が頻度配列に存在する場合(すべての桁に対してtotal[現在の桁]が非ゼロの場合)、カウントを1増やします。
- long long int型のN_digitsを入力として受け取ります。
- 関数check(int arr[], int val)は、頻度配列arr[]とASCII値valを引数に取り、valがarr[]内の桁で構成できる場合はtrueを返します。
- forループを使用して、頻度配列のコピーとしてtotal[10]を作成します。
- whileループを使用して、valの各桁を取り出し、total[]内で検索します。
- total[桁]が0の場合はfalseを返し、そうでない場合はその桁を使用してカウントを1減らします。
- 次の最下位桁(LSB)を処理するために、valを10で割って更新します。
- whileループが最後まで完了すれば、valはtotal[]内の桁で構成できるためtrueを返します。
- 関数ASCII_N(long long int N_digits)は入力された数値を受け取り、Nの桁からASCII値を形成できるアルファベットの個数を返します。
- 初期カウントを0とし、頻度配列total[10]をすべて0で初期化します。
- whileループを使用して、N_digitsの各桁の頻度配列を作成します。最下位桁をvalues = N_digits % 10として取り出し、total[values]を1増やします。
- N_digitsを10で割って更新します。
- 97〜122および65〜90の範囲のアルファベットのASCII値をforループで順に調べます。
- check(total, i)がtrueを返す場合はカウントを1増やします。
- 両方のforループの終了後に、結果としてcountを返します。
例
#include<bits/stdc++.h>
using namespace std;
bool check(int arr[], int val) {
int total[10];
for (int i = 0; i < 10; i++) {
total[i] = arr[i];
}
while (val > 0) {
int values = val % 10;
if (total[values] == 0) {
return false;
} else {
total[values]--;
}
val = floor(val / 10);
}
return true;
}
int ASCII_N(long long int N_digits) {
int count = 0;
int total[10] = {
0
};
while (N_digits > 0) {
int values = N_digits % 10;
total[values]++;
N_digits = floor(N_digits / 10);
}
for (int i = 97; i <= 122; i++) {
if (check(total, i)) {
count++;
}
}
for (int i = 65; i < 91; i++) {
if (check(total, i)) {
count++;
}
}
return count;
}
int main() {
long long int N_digits = 251326;
cout << "Count of alphabets whose ASCII values can be formed with the digits of N are: " << ASCII_N(N_digits);
}
上記のコードを実行すると、次のような出力が生成されます −
出力
Count of alphabets whose ASCII values can be formed with the digits of N are: 2
-
C++で「数値とその各桁の合計がNに等しい数X」を見つける方法
このチュートリアルでは、「ある数値Xとその各桁の数字の合計を足した値が、与えられた数Nと等しくなる」という条件を満たす数Xを見つける方法を解説します。 解法のアイデア 考え方は非常にシンプルです。与えられた数Nの前後それぞれ100以内の範囲にある数をすべてチェックします。 制約として N ≤ 1,000,000,000(10億)であり、各桁の数字の合計は最大でも100程度にしかなりません。そのため、答えとなる数Xがこの範囲の外側に存在することはありません。 アルゴリズムの手順 対象となる数値Nを初期化します。 0から100まで繰り返すループを作成します。 n - i と n + i の値を
-
C++でXとの合計がフィボナッチ数になるノードを数える方法
各ノードに数値の重みが割り当てられた二分木が与えられます。この記事の目的は、「ノードの重み + X」の計算結果がフィボナッチ数となるノードの個数を求めることです。フィボナッチ数列とは、0, 1, 1, 2, 3, 5, 8, 13… のように続く数列で、n番目の数は(n−1)番目と(n−2)番目の数の和になります。たとえば重みが13であればフィボナッチ数に該当するため、そのノードはカウント対象となります。入力例1temp = 1 の場合。値を入力すると、以下のような木が構成されます。出力Count the nodes whose sum with X is a Fibonacci number