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

whileループを使って回文数(パリンドローム)を判定するCプログラム

回文数(パリンドローム数)とは、数字を逆から読んでも元の数と同じになる数のことです。たとえば「1221」や「12321」などが該当します。C言語では、ユーザーが入力した正の整数に対して、whileループを使うことでその数が回文数かどうかを簡単に判定できます。

回文数判定の基本的な流れ

whileループによる判定は、次の手順で行われます。

  • 入力された数値を10で割った余りで、下1桁を取り出します。
  • 取り出した桁を「逆順の数 × 10 + 余り」として積み上げ、反転した数を作ります。
  • 元の数値を10で割って桁をずらし、0になるまで繰り返します。
  • 最後に、反転した数と元の数を比較し、一致していれば回文数と判定します。

例1:数値の回文判定プログラム

以下は、whileループを使用して回文数を判定するCプログラムの例です。

#include <stdio.h>
int main(){
    int num, temp, rem, rev = 0;
    printf("enter a number:\n");
    scanf("%d", &num);
    temp = num;
    while ( temp > 0){
        rem = temp %10;
        rev = rev *10+ rem;
        temp = temp /10;
    }
    printf("reversed number is = %d\n", rev);
    if ( num == rev )
        printf("\n%d is Palindrome Number.\n", num);
    else
        printf("%d is not the Palindrome Number.\n", num);
    return 0;
}

実行結果

上記のプログラムを実行すると、次のような結果が出力されます。

enter a number:
1234
reversed number is = 4321
1234 is not the Palindrome Number.
enter a number:
1221
reversed number is = 1221
1221 is Palindrome Number.

このように、「1234」を反転すると「4321」になり元の数と一致しないため回文数ではありませんが、「1221」は反転しても「1221」のままであるため、回文数と判定されます。

例2:文字列の回文判定プログラム

次に、文字列が回文かどうかをwhileループで判定する例を紹介します。この方法では、文字列の先頭と末尾から順に1文字ずつ比較していき、すべて一致すれば回文と判断します。

#include <stdio.h>
#include <string.h>
void pal(char string[]);
int main(){
    char string[100];
    printf("enter a string: ");
    gets(string);
    pal(string);
    return 0;
}
void pal(char string[]){
    int i = 0;
    int length = strlen(string) - 1;
    while (length > i){
        if(string[i++] != string[length--]){
            printf("\n %s is not a palindrome", string);
            return;
        }
    }
    printf("\n %s is a palindrome string", string);
}

実行結果

上記のプログラムを実行すると、次のような結果が出力されます。

enter a string: tutorial
tutorial is not a palindrome
enter a string: saas
saas is a palindrome string

補足:gets関数の注意点

なお、上記のコードで使用している gets() 関数はバッファオーバーフローの危険があるため、現在のC標準(C11以降)では廃止されています。実際の開発では、代わりに fgets(string, sizeof(string), stdin) を使用するなど、安全な入力方法を採用することをおすすめします。

  1. Pythonで桁和ごとにボールを仕分けし、最も多くのボールが入る箱の数を求める方法

    問題概要 あるボール工場では、lからrまで(両端を含む)の番号が付いたn個のボールを生産しており、1番から無限大まで番号の付いた箱が無限に用意されています。各ボールは、そのボール番号の各桁の合計(桁和)と同じ番号の箱に入れるというルールがあります。 例えば、ボール番号123であれば、1 + 2 + 3 = 6 となるため、6番の箱に入ります。このとき、2つの値lとrが与えられた場合、最も多くのボールが入っている箱のボール数を求めるのがこの問題の目的です。 具体例で確認する 入力が l = 15、r = 25 の場合を考えてみましょう。各ボールは次のように振り分けられます。 ボール15 →

  2. 【Python】文字列を回文に分割する方法の数を求めるアルゴリズムと実装

    文字列 s が与えられたとき、その文字列を「すべての部分が回文になるように」分割する方法が何通りあるかを求める問題について解説します。回文とは、前から読んでも後ろから読んでも同じになる文字列のことです。例えば「x」「yy」「xyyx」などはいずれも回文です。問題の例入力が s = xyyx の場合、出力は 3 になります。これは以下の3通りの分割方法が存在するためです。[x, yy, x][x, y, y, x][xyyx]解法のアプローチ(動的計画法)この問題は動的計画法(DP)を使って効率的に解くことができます。ここでは、table[i] を「文字列の先頭から i 文字目までを回文に分割す