C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で数値の各桁を3と8のみに変換する方法

はじめに

このチュートリアルでは、与えられた整数の各桁を「3」と「8」のみで構成されるように変換するプログラムをC++で解説します。

具体的には、ある整数が与えられたとき、次のいずれかの操作を用いてすべての桁を3または8に変換することを目標とします。

  • 数値全体に1を加算または減算する
  • 特定の桁を任意の数字に直接置き換える

アルゴリズムの考え方

最もシンプルで効率的なアプローチは、各桁を1つずつ確認する方法です。ある桁が「3」でも「8」でもない場合、その桁を直接「3」または「8」に書き換えればよいため、その桁につき1回の操作が必要になります。

つまり、最小操作回数 = 「3」でも「8」でもない桁の個数となります。

C++での実装例

#include <bits/stdc++.h>
using namespace std;
//必要な最小操作回数を計算する
int cal_min(long long int num){
    //余りと操作回数を計算
    int rem;
    int count = 0;
    while (num) {
        rem = num % 10;
        if (!(rem == 3 || rem == 8))
        count++;
        num /= 10;
    }
    return count;
}
int main(){
    long long int num = 2341974;
    cout << "最小操作回数: " << cal_min(num);
    return 0;
}

出力結果

最小操作回数: 6

コードの解説

このプログラムでは、関数 cal_min() が数値の最小操作回数を計算します。処理の流れは以下の通りです。

  1. whileループ内で num % 10 により最下位の桁(余り)を取り出します。
  2. その桁が「3」でも「8」でもない場合、カウンタ count を1つ増やします。
  3. num /= 10 で数値を1桁右にずらし、すべての桁を確認し終えるまで繰り返します。

入力例の「2341974」の場合、各桁は 2, 3, 4, 1, 9, 7, 4 です。このうち「3」に該当するのは1桁だけで、残りの6桁は3でも8でもないため、最小操作回数は6回となります。

まとめ

本記事では、整数の各桁を3と8のみに変換するために必要な最小操作回数を求めるC++プログラムを紹介しました。各桁を走査して条件を満たさない桁の数を数えるだけのシンプルなアルゴリズムで、計算量はO(桁数)と非常に効率的です。数値を文字列として扱う方法でも同様に実装できるので、ぜひ試してみてください。

  1. C++で0と1のみからなる長さNの2進文字列の総数を求める方法

    ある整数 num が与えられたとき、0と1のみで構成される長さ num の2進文字列が何通り作れるかを求めるのが本記事の課題です。 2進数(バイナリ)は数値表現の手法のひとつで、デジタルシステムにおいて最も広く利用されています。2進数は、「開く/閉じる」の2状態しか持たないスイッチのように、動作状態が2つしかないデバイスで表現できる量を扱うために用いられます。 2進数体系で使われる記号は 0 と 1 の2種類だけです。2進文字列とは、これらの2進値(0または1)のみから構成される文字列のことを指します。 例 入力 − num = 3 出力 − count is 8 説明 − 長さ3で作れる2

  2. C++で桁の合計がnとなる最小のラッキーナンバー(4と7のみで構成)を求める方法

    問題の概要ラッキーナンバーとは、10進表記がラッキーな数字である「4」と「7」のみで構成される正の整数のことです。この問題では、各桁の数字の合計がnと等しくなるような、最小のラッキーナンバーを求めます。例sum = 22 の場合、4 + 4 + 7 + 7 = 22 が成立するため、答えは 4477 となります。アルゴリズムsumが4の倍数であれば、答えはすべて「4」で構成されます。sumが7の倍数であれば、答えはすべて「7」で構成されます。sumが4の倍数でも7の倍数でもない場合は、どちらかの数字を引き続け、sumがもう片方の倍数になるまで減算を行います。実装例(C++)#include &