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

C++で数値が回文かどうかを再帰的に判定するプログラム

整数が入力として与えられます。ここでの目的は、再帰(recursion)を利用して、入力された数値 Num が回文(パリンドローム)であるかどうかを判定することです。

回文とは、読む方向に関係なく同じ並びになる文字列や数値のことです。数値が回文かどうかを調べるには、その数を反転し、元の数と比較します。反転した数が元の数と一致すれば、それは回文であると言えます。

具体例

入力 − Num = 34212;

出力 − 34212 is not a Palindrome!

解説 − 34212 を反転すると 21243 になります。34212 ≠ 21243 なので、入力された数は回文ではありません。

入力 − Num = 32123;

出力 − 32123 is Palindrome!

解説 − 32123 を反転しても 32123 のままです。反転後の数と元の数が一致しているため、入力された数は回文です。

プログラムで使用するアプローチ

このアプローチでは、入力数値 num1 と一時的な数値 num2 を引数に取る再帰関数 revrsNum(int num1, int num2) を使用します。

基本ケース: num1 が 0 になった場合、num2 を返します。

再帰ケース: それ以外の場合は、再帰処理によって num1 の反転を計算し、その結果を返します。

最終的に、反転した数と元の数が一致していれば、入力された数は回文であると判定できます。

アルゴリズムの手順

  • 入力数値 Num を受け取ります。
  • Num2 = revrsNum(Num, 0) として反転した数を取得します。
  • 関数 revrsNum(int num1, int num2) は、num1 の反転を再帰的に生成し、その結果を返します。
  • num1 が 0 の場合、これまでに計算された反転結果 num2 を返します。
  • そうでなければ、num2 を 10 倍して num1 % 10(最下位桁)を加算します。
  • num1 = num1 / 10 により、num1 の桁を 1 桁減らします。
  • revrsNum(num1, num2) を呼び出して再帰処理を続けます。
  • 結果を返します。
  • main 関数内で得られた結果を出力します。

サンプルコード

#include <bits/stdc++.h>
using namespace std;
int revrsNum(int num1, int num2){
    if (num1 == 0){
        return num2;
    }
    num2 *= 10;
    num2 += (num1 % 10);
    num1 = num1/10;
    return revrsNum(num1, num2);
}
int main(){
    int Num = 1345431;
    int Num2 = revrsNum(Num,0);
    if (Num == Num2){
        cout <<Num<<" is Palindrome!";
    }
    else{
        cout <<Num<<" is not a Palindrome!";
    }
    return 0;
}

出力

上記のコードを実行すると、次の出力が生成されます。

1345431 is Palindrome!

補足:実装上の注意点

この手法はシンプルで理解しやすい反面、大きな数値を扱う場合は反転後の数が int 型の範囲を超えてオーバーフローする可能性がある点に注意してください。より大きな入力に対応したい場合は、long long 型を使用するか、数値を文字列として処理する方法も検討するとよいでしょう。

  1. C++で部分文字列[L…R]が回文かどうかを判定するクエリ処理プログラム

    この記事では、文字列 str と、それぞれ2つの値 L と R から構成される Q 個のクエリが与えられたとき、各クエリに対して部分文字列 [L…R] が回文(前から読んでも後ろから読んでも同じ文字列)であるかどうかを判定するプログラムを C++ で作成する方法を解説します。問題の概要各クエリを処理する際には、指定された範囲 L から R までで切り出した部分文字列が回文であるかどうかを確認する必要があります。具体例で問題を理解しよう入力str = abccbeba , Q = 3 Query[][] = {{1, 4}, {0, 6}, {4, 6}}出力Palindrome Not Pal

  2. C++のSTLを使って配列が回文かどうかを判定するプログラム

    整数 n 個からなる配列 arr[n] が与えられたとき、「その配列は回文(パリンドローム)か?」を判定するのが本稿のテーマです。C++ の STL(標準テンプレートライブラリ)を活用して、この問題をシンプルに解いていきます。 STLとは STL(Standard Template Library)は、C++ に用意されたテンプレートクラスの集合体で、スタック・キュー・リストといったデータ構造や、ソート・反転などの便利な関数を提供します。これらを活用するには、テンプレートクラスに関する基本的な知識が必要です。本稿では、STL の reverse() 関数を使って配列を反転させています。 回文と