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) を使用するなど、安全な入力方法を採用することをおすすめします。
-
Pythonで桁和ごとにボールを仕分けし、最も多くのボールが入る箱の数を求める方法
問題概要 あるボール工場では、lからrまで(両端を含む)の番号が付いたn個のボールを生産しており、1番から無限大まで番号の付いた箱が無限に用意されています。各ボールは、そのボール番号の各桁の合計(桁和)と同じ番号の箱に入れるというルールがあります。 例えば、ボール番号123であれば、1 + 2 + 3 = 6 となるため、6番の箱に入ります。このとき、2つの値lとrが与えられた場合、最も多くのボールが入っている箱のボール数を求めるのがこの問題の目的です。 具体例で確認する 入力が l = 15、r = 25 の場合を考えてみましょう。各ボールは次のように振り分けられます。 ボール15 →
-
【Python】文字列を回文に分割する方法の数を求めるアルゴリズムと実装
文字列 s が与えられたとき、その文字列を「すべての部分が回文になるように」分割する方法が何通りあるかを求める問題について解説します。回文とは、前から読んでも後ろから読んでも同じになる文字列のことです。例えば「x」「yy」「xyyx」などはいずれも回文です。問題の例入力が s = xyyx の場合、出力は 3 になります。これは以下の3通りの分割方法が存在するためです。[x, yy, x][x, y, y, x][xyyx]解法のアプローチ(動的計画法)この問題は動的計画法(DP)を使って効率的に解くことができます。ここでは、table[i] を「文字列の先頭から i 文字目までを回文に分割す