C++で文字列内のASCII値が素数である文字をカウントする方法
本記事では、大文字と小文字を含む任意の長さの文字列が与えられたとき、その中でASCII値が素数となっている文字の個数を求める方法を解説します。
アルファベット大文字[A-Z]のASCII値は65〜90、小文字[a-z]のASCII値は97〜122の範囲に割り当てられています。これらの値の中には素数と非素数が混在しているため、各文字のASCII値を一つずつ判定していく必要があります。
具体例
入力 string str = "Aebg" 出力 カウント数:2
説明:「A」のASCII値は65で素数ではないためカウントされません。「e」は101で素数なのでカウントされます。「b」は66で素数ではないためカウント対象外、「g」は103で素数なのでカウントされます。したがって、ASCII値が素数である文字は合計2個となります。
入力 string str = "GOXFH" 出力 カウント数:2
説明:「G」のASCII値は71で素数のためカウントされます。「O」も79で素数のためカウントされます。一方、「X」は88、「F」は70、「H」は72といずれも素数ではないためカウントされません。結果として、ASCII値が素数の文字は合計2個となります。
プログラムのアプローチ
- 文字列を入力し、変数(例:str)に格納します。
- length()関数を使って文字列strの長さを取得します。この関数は空白を含む文字数に応じた整数値を返します。
- 各文字の判定に使用する、素数を計算する関数を宣言します。
- iを0から文字列の長さまでループさせ、文字列全体を走査します。
- ループ内で、走査中の文字のASCII値が素数かどうかを判定します。素数であればカウントを1増やし、そうでなければそのままにします。
- カウントの合計値を返します。
- 結果を出力します。
コード例
以下のコードでは、エラトステネスの篩(ふるい)を用いて、ASCII値の最大範囲をカバーする257以下の素数をあらかじめすべて求めておくことで、各文字の判定を高速に行っています。
#include <iostream>
#include <vector>
using namespace std;
#define max_val 257
// 文字列内のASCII値が素数である文字を数える関数
int countprime(string str){
// 'max_val'以下の素数を求めるためにエラトステネスの篩を使用
// ブール型配列 "prime[0..n]"。prime[i] の値は、
// i が素数でなければ最終的に false、素数なら true となる。
vector<bool> prime(max_val + 1, true);
// 0と1は素数ではない
prime[0] = false;
prime[1] = false;
for (int p = 2; p * p <= max_val; p++){
// prime[p] が true のままなら、p は素数
if (prime[p] == true) {
// p のすべての倍数を false に更新する
for (int i = p * 2; i <= max_val; i += p){
prime[i] = false;
}
}
}
int result = 0;
// 文字列全体を走査する
for (int i = 0; i < str.length(); ++i){
if (prime[int(str[i])]){
result++;
}
}
return result;
}
// main関数
int main(){
string str = "tutorialspoint";
// 結果を出力
cout <<"count is: "<< countprime(str);
return 0;
}
出力
上記のコードを実行すると、次のような出力が得られます。
count is:1
このように、エラトステネスの篩で素数表を事前に作成しておけば、文字ごとの素数判定は配列参照のみで済むため、長い文字列でも効率的に処理できます。
-
【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に含まれるAS
-
C++で文字列の重みに母音を含む木のノード数をカウントする方法
各ノードの重みが文字列として与えられた二分木があるとします。この記事の目的は、重みの文字列に母音が含まれているノードの数を求めることです。たとえば、あるノードの重みが「aer」であれば、母音「a」と「e」が含まれているため、このノードはカウント対象になります。 入力例1 値を入力した後に作成される木は以下の通りです。 出力 Count the nodes of the tree whose weighted string contains a vowel are: 5 説明 木の各ノードと、それらに関連付けられた文字列の重みが与えられています。ここで、各ノードの文字列に母音が含まれているかど