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

C++で数値とその逆順との差がkの倍数になる数を数える方法

範囲 [l, r] と整数 k が与えられます。求めたいのは、l 以上 r 以下の数のうち、「その数の逆順 − その数」の絶対値が k の倍数になっているものの個数です。

この条件は、l から r まで順番に各数の逆順を計算し、元の数との差の絶対値が k で割り切れるかどうか(差 % k == 0)を確認することで判定できます。条件を満たしたらカウントを1つ増やします。

具体例で見てみましょう。

入力 − L=21, R=25, K=6

出力 − 条件を満たす数の個数 − 2

説明

各数とその逆順、そして差は以下の通りです。
21 → 12, |21−12|=9, 9%6≠0
22 → 22, |22−22|=0, 0%6=0 → count=1
23 → 32, |32−23|=9, 9%6≠0
24 → 42, |42−24|=18, 18%6=0 → count=2
25 → 52, |52−25|=27, 27%6≠0
条件を満たす数は合計2個(22、24)

入力 − L=11, R=15, K=5

出力 − 条件を満たす数の個数 − 1

説明

唯一の該当数は 11 です。|11−11|=0 となり、0%5=0 を満たします。

プログラムで使用しているアプローチ

  • 範囲を定義する整数 L と R、および整除性の判定に使用する K を入力として受け取ります。

  • 関数 countNumbers(int l, int r, int k) が l、r、k を引数に取り、条件を満たす数の個数を返します。

  • カウント用変数 count を 0 で初期化します。

  • 逆順を格納する rev = 0、余りを格納する rem = 0 も初期化しておきます。

  • i = l から i = r までループ処理を行います。

  • 現在の数 i を num に保存し、rev を 0 にリセットします。

  • while(num > 0) ループで num を反転させます。rem = num % 10、rev = rev * 10 + rem、num = num / 10 の手順です。

  • while ループが終了すると、rev には i の逆順が格納されています。

  • rev と元の値 i の絶対差を計算し、|i − rev| % k == 0 であれば count をインクリメントします。

  • この処理を範囲内のすべての数に対して繰り返します。

  • 最終的な count の値を、「数値とその逆順との差が k の倍数となる数」の個数として返します。

実装例

#include <iostream>
using namespace std;
int countNumbers(int l, int r, int k){
    int rev = 0;
    int count=0;
    int rem=0;
    for (int i = l; i <= r; i++){
        int num=i;
        rev=0;
        while (num > 0){
            // 数を反転させる
            rem=num%10;
            rev = rev * 10 + rem;
            num /= 10;
        }
        if((abs(i-rev))%k==0) // 元の数が i、逆順が rev
            { count++; }
    }
    return count;
}
int main(){
    int L= 18, R = 24, K = 6;
    cout <<" Numbers whose difference with reverse is product of k:"<<countNumbers(L,R,K);
    return 0;
}

出力

上記のコードを実行すると、次の出力が得られます −

Numbers whose difference with reverse is product of k:4
  1. 【C++】配列内のすべての素数の積を求める方法

    整数型配列 arr[] が与えられたとき、その配列に含まれるすべての素数を見つけ出し、それらの積を計算するのが本記事のテーマです。素数とは、1とその数自身でしか割り切れない正の整数のことです。たとえば、2、3、5、7、11などが素数に該当します。それでは、次の配列を例に解を求めてみましょう。入力: arr[] = { 11, 20, 31, 4, 5, 6, 70 }出力: 1705説明: 配列内の素数は 11、31、5 の3つであり、その積は 11 × 31 × 5 = 1705 となります。入力: arr[] = { 1, 2, 3, 4, 5, 6, 7 }出力: 210説明: 配列内の

  2. 配列の要素の積の最初の桁を求めるC++プログラム

    はじめにこの記事では、与えられた配列のすべての要素を掛け合わせた積の、最初の桁(最上位の桁)を求めるプログラムについて解説します。例として、次のような配列が与えられたとします。arr = {12, 5, 16}これらの要素の積は、12 × 5 × 16 = 960 となります。したがって、求める結果、つまり積の最初の桁は「9」になります。アルゴリズム変数 prod を 1 で初期化するループを使い、配列の各要素を順番に prod に掛けていくprod が 10 以上である間、prod を 10 で割り続ける残った一桁の値が、積の最初の桁となるサンプルコード#include <bits/s