ラッキー数字がk個以下の整数を数えるC++プログラムの解説
要素数nの配列Aと整数kが与えられた場面を考えてみましょう。「ラッキーナンバー」とは、10進表現において幸運な数字とされる「4」と「7」だけで構成される正の整数のことです。この記事では、配列Aに含まれる各整数のうち、ラッキー数字(4または7)の出現回数がk個以下であるものがいくつあるかを求める方法を解説します。
例えば、入力が A = [44, 74, 474, 154]、k = 2 の場合、出力は3になります。44はラッキー数字を2つ持ち、74も2つ持つため条件を満たします。一方、474はラッキー数字を3つ持つためk=2を超えており、対象外です。また、154はラッキー数字を1つしか含まないため、こちらも条件を満たします。
解法のアプローチ
この問題は、次の手順で解くことができます。
- 各要素について、下の桁から順に1桁ずつ確認していきます。
- その桁が4または7であれば、カウンターcを1増やします。
- 数値を10で割り、すべての桁の確認が終わるまで繰り返します。
- 桁ごとの集計が完了した後、カウントcがk以下であれば答えfを1増やします。
- すべての要素を処理し終えたら、fを結果として返します。
n := size of A f := 0 for initialize i := 0, when i < n, update (increase i by 1), do: c := 0 while A[i] is not equal to 0, do: if A[i] mod 10 is same as 4 or A[i] mod 10 is same as 7, then: (increase c by 1) A[i] := A[i] / 10 if c <= k, then: (increase f by 1) return f
実装例
理解を深めるために、実際のC++コードを見てみましょう。各数値を10で割りながら最下位の桁を取り出し、その桁が4か7かどうかを判定するシンプルな手法です。
#include<bits/stdc++.h>
using namespace std;
int solve(vector<int> A, int k){
int n = A.size();
int f = 0;
for (int i = 0; i < n; ++i){
int c = 0;
while (A[i] != 0){
if (A[i] % 10 == 4 || A[i] % 10 == 7)
c++;
A[i] /= 10;
}
if (c <= k)
f++;
}
return f;
}
int main(){
vector<int> A = {44, 74, 474, 154};
int k = 2;
cout << solve(A, k) << endl;
}入力
{44, 74, 474, 154}, 2出力
3
-
C++で数値の各桁を3と8のみに変換する方法
はじめにこのチュートリアルでは、与えられた整数の各桁を「3」と「8」のみで構成されるように変換するプログラムをC++で解説します。具体的には、ある整数が与えられたとき、次のいずれかの操作を用いてすべての桁を3または8に変換することを目標とします。数値全体に1を加算または減算する特定の桁を任意の数字に直接置き換えるアルゴリズムの考え方最もシンプルで効率的なアプローチは、各桁を1つずつ確認する方法です。ある桁が「3」でも「8」でもない場合、その桁を直接「3」または「8」に書き換えればよいため、その桁につき1回の操作が必要になります。つまり、最小操作回数 = 「3」でも「8」でもない桁の個数となりま
-
C++で数を割り切る桁の個数を求める方法
問題の概要ある整数が与えられたとき、その数を割り切る桁(各桁の数字)の個数を数える問題です。例として、数が 1012 の場合を考えてみましょう。この場合、答えは 3 となります。1、1、2 の3つの桁がそれぞれ 1012 を割り切れるためです。解法のアプローチこの問題を解くには、剰余演算(% 演算子)を使って数の各桁を1つずつ取り出し、元の数がその桁の値で割り切れるかどうかを判定します。割り切れる場合はカウンターを1つ増やします。なお、桁が 0 の場合は 0 で割ることができないため、その桁はスキップ(無視)します。アルゴリズムの流れ元の数のコピーを作成し、0 になるまでループを繰り返します。