if文やswitch文を使わずに各桁の数字を英語の単語として出力するCプログラム
与えられた数値を英語の単語として出力するプログラムを考えてみましょう。switch文を使えば0から9までのケースを列挙するだけで簡単に実装できますが、ここでの課題は、if文やswitch文を一切使わずにこれを実現することです。
入力 − N=900
出力 − NINE ZERO ZERO
この課題は、0から9までの数字に対応する英単語をあらかじめ格納したポインタ配列を作成しておくことで解決できます。各桁の文字から文字コード'0'を引けば、そのまま配列のインデックスとして利用できるのがポイントです。
アルゴリズム
START
ステップ1 → int型変数num、i、および{"ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE"}を格納したポインタ配列char *alphaを宣言する
ステップ2 → char型配列str[20]を宣言する
ステップ3 → 関数itoaを引数(num, str, 10)で呼び出す
ステップ4 → i=0からstr[i]!='\0'の間、iを1ずつ増やしながらループ
alpha[str[i] - '0']を出力する
ステップ5 → ループ終了
STOP実装例
#include<stdio.h>
#include<stdlib.h>
int main() {
int num, i;
num=900; // 出力する数値
char *alpha[11] = {"ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE"};
char str[20];
itoa(num, str, 10); // 整数を文字列に変換する関数
for(i=0; str[i] != '\0'; i++)
printf("%s ", alpha[str[i] - '0']);
return 0;
}仕組みの解説
このプログラムの鍵となるのは「str[i] - '0'」という式です。これは文字としての数字を整数値に変換する定番のテクニックで、たとえば文字'9'のASCIIコードは57、'0'は48なので、57 − 48 = 9 となり、alpha[9]すなわち"NINE"が参照されます。この仕組みにより、if文やswitch文による分岐処理を一切書かずに、各文字から対応する単語を直接取り出すことができます。
出力結果
上記のプログラムを実行すると、以下のような出力が得られます。
Enter an integer 900 NINE ZERO ZERO
なお、itoa関数はC言語の標準規格には含まれておらず、処理系によっては利用できない場合があります。その際は、sprintf関数などで代用すると同様の結果が得られます。
-
【Python】ループを使わずに数列を出力する方法:再帰呼び出しを活用した実装
はじめに 本記事では、以下の問題に対する解決策について詳しく解説します。 問題の概要 2つの整数 N と K が与えられたとき、N が 0 より大きい間は N から K を引き続けます。そして N が 0 以下になったら、今度は元の値 N に戻るまで K を足していきます。 入力例 N = 10 K = 4 出力例 10 6 2 -2 2 6 10 アルゴリズムの考え方 N が 0 より大きい間、関数を再帰的に呼び出し続けます(各呼び出しごとに N から K を減算します)。 数値が 0 以下になったら、元の値に戻るまで各呼び出しごとに K を加算します。 加算と減算は同じ1つの関数
-
ループを使わずに数列を出力するPythonプログラム|再帰とフラグで実現する方法
本記事では、for文やwhile文などのループ構文を一切使わずに数列を表示するという問題の解法について解説します。問題の定義問題: 2つの数値 N と K が与えられます。まずNが0より大きい間はNからKを繰り返し引き、Nが0以下(ゼロまたは負)になったら、今度は逆にKを足していきます。そして値が元の数値Nに戻った時点で処理を終了します。実行例N = 10K = 4出力: 10 6 2 -2 2 6 10アルゴリズムNが0より大きい間、関数を再帰的に呼び出し続けます。各呼び出しのたびにNからKを減算します。数値が0以下になったら加算モードに切り替え、各呼び出しごとにKを加算します。元の数値Nに