C++でASCII値がk未満とk以上のアルファベットの出現回数を数える方法
任意の長さの文字列と整数値 k が与えられたとき、ASCII値が k 未満のアルファベットと、k 以上のアルファベットの個数をそれぞれ求めるのが本記事の目的です。
アルファベット大文字(A〜Z)のASCIIコード一覧
| A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S |
| 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 |
| T | U | V | W | X | Y | Z |
| 84 | 85 | 86 | 87 | 88 | 89 | 90 |
アルファベット小文字(a〜z)のASCIIコード一覧
| a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s |
| 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 |
| t | u | v | w | x | y | z |
| 116 | 117 | 118 | 119 | 120 | 121 | 122 |
入力例と出力例
入力: str = "TuTorials PoinT", k = 100
出力:
ASCII値が k 未満のアルファベットの数 − 6
ASCII値が k 以上のアルファベットの数 − 9
解説:
k として 100 が与えられているため、文字列内の各文字のASCII値を順に確認します。T は 84 < 100、u は 117 > 100、o は 111 > 100、r は 114 > 100、i は 105 > 100、a は 97 < 100、l は 108 > 100、s は 115 > 100、P は 80 < 100、n は 110 > 100 です。したがって、ASCII値が k 未満のアルファベットは合計 6 個、k 以上のアルファベットは合計 9 個となります。
入力: str = "HellO All", k = 90
出力:
ASCII値が k 未満のアルファベットの数 − 3
ASCII値が k 以上のアルファベットの数 − 5
解説:
H は 72 < 90、e は 101 > 90、l は 108 > 90、l は 108 > 90、O は 79 < 90、A は 65 < 90、l は 108 > 90、l は 108 > 90 です。よって、ASCII値が k 未満のアルファベットは合計 3 個、k 以上のアルファベットは合計 5 個になります。
プログラムで使用するアプローチ
大文字・小文字を含む文字列と整数値 k を入力として受け取ります。
str.length() 関数を使って文字列の長さを取得し、処理用の関数に渡します。
k 未満の文字数を格納するための一時変数 count を作成し、0 で初期化します。
i を 0 から文字列の長さまでループ(FOR)させます。
ループ内で str[i] < k であるかどうかを判定し、条件を満たしていれば count を 1 ずつ加算します。
k 未満の文字数として count を返します。
k 以上の文字数は「全体の長さから k 未満の数を引く」ことで算出します。具体的には int greater = len - Less_than(str, k, len); のように計算します。
最後に結果を出力します。
サンプルコード(C++での実装例)
#include <bits/stdc++.h>
using namespace std;
// ASCII値が k 未満および k 以上のアルファベットの数を数える
int Less_than(string str, int k, int length){
int count = 0;
for (int i = 0; i < length; i++){
if (str[i] < k){
count++;
}
}
return count;
}
int main(){
string str = "TuTorials PoinT";
int k = 100;
int len = str.length();
cout<<"ASCII値がk未満のアルファベットの数: "<<Less_than(str,k, len);
int greater = len - Less_than(str,k, len);
cout<<"\nASCII値がk以上のアルファベットの数: "<<greater;
return 0;
}出力結果
上記のコードを実行すると、次のような出力が得られます。
Count of alphabets having ASCII value less than k are: 6 Count of alphabets having ASCII value equals or greater than k are: 9
-
C++で積がK未満となる部分列の個数を求める方法
このチュートリアルでは、積がK未満となる部分列(サブシーケンス)の個数を求めるプログラムについて解説します。問題設定は次のとおりです。非負の整数からなる配列と値kが与えられたとき、配列の要素を選んで構成できる部分列のうち、要素の積がk未満になるものの総数を求めます。動的計画法によるアプローチこの問題は動的計画法(DP)を使うことで効率的に解けます。ここでは、dp[i][j] を「先頭からj個の要素の中から選んだ部分列のうち、積がi未満になるものの個数」と定義します。遷移は次のように考えます。まず、j番目の要素 arr[j-1] を部分列に含めない場合の数は dp[i][j-1] です。次に、含
-
C++で指定された合計以下となる最大合計の部分配列を求める方法
問題の概要 この問題では、整数の配列と合計値(上限)が与えられます。求めるのは、「要素の合計が指定された値以下となる部分配列(連続する要素の並び)」のうち、合計が最大になるものです。 配列の長さを n とするとき、長さが n 以下の任意の部分配列を対象に、合計が指定値を超えない範囲で最大の合計を見つけなければなりません。 入力と出力の例 入力: array = {3, 5, 1, 8, 2, 9}, sum = 25 出力: 25 解説: 合計が25以下となる部分配列のうち最大なのは {5, 1, 8, 2, 9} で、その合計はちょうど25です。配列全体の合計は28なので上限を超え、これが