【C++】条件文を使わずに偶数・奇数を判定して出力する2つの方法
はじめに
この記事では、比較演算子(<、<=、!=、>、>=、==)などの条件文を一切使わずに、数値が偶数か奇数かを判定して出力するC++プログラムの書き方を解説します。
通常、偶数・奇数の判定は条件文を使えば簡単です。数値を2で割った余りが0なら偶数、そうでなければ奇数と判断できます。あるいは、数値と1のビットごとのAND演算を行い、結果が0なら偶数、1なら奇数と判定することも可能です。
しかし今回は条件文が使用できないため、少し工夫が必要になります。ここでは、考え方の異なる2つの方法を紹介します。
方法1:文字列配列のインデックスを利用する
まずは文字列の配列を活用する方法です。インデックス0には「偶数」、インデックス1には「奇数」をあらかじめ格納しておきます。そして、数値を2で割った余り(n % 2)をそのまま配列のインデックスとして渡せば、結果を直接取得できます。余りが0なら偶数、1なら奇数という対応関係が、そのまま配列参照に反映される仕組みです。
サンプルコード
#include <iostream>
using namespace std;
main() {
int n;
string arr[2] = {"偶数", "奇数"};
cout << "数値を入力してください: "; // ユーザーから数値を受け取る
cin >> n;
cout << "この数値は: " << arr[n % 2]; // 余りをインデックスとして文字列を選択
}実行結果1
数値を入力してください: 40 この数値は: 偶数
実行結果2
数値を入力してください: 89 この数値は: 奇数
方法2:論理演算子とビット演算子を組み合わせる
次に紹介するのは、論理演算子とビット演算子を組み合わせたテクニックです。まず、数値と1のビットごとのAND演算(n & 1)を実行します。最下位ビット(LSb)に1が立っていれば演算結果は1となり、その数値は奇数であることがわかります。
続いて、論理AND(&&)と論理OR(||)の短絡評価を利用して出力を切り替えます。ビットANDの結果が1の場合のみ論理AND式全体が真となり「奇数」が出力され、結果が0の場合は左辺が偽となるため、右側の「偶数」の出力が実行される仕組みです。
サンプルコード
#include <iostream>
using namespace std;
main() {
int n;
cout << "数値を入力してください: "; // ユーザーから数値を受け取る
cin >> n;
(n & 1 && cout << "奇数") || cout << "偶数"; // 最下位ビットが1なら奇数
}実行結果1
数値を入力してください: 40 偶数
実行結果2
数値を入力してください: 89 奇数
まとめ
条件文が使えなくても、配列のインデックスや短絡評価の性質を上手に利用すれば、偶数・奇数の判定は十分に実現できます。方法1はシンプルで可読性が高く実用的な一方、方法2はC++の演算子の評価順序を深く理解していないと書けないテクニカルな手法です。プログラミング学習や技術面接の題材としても役立つ内容なので、ぜひ両方のコードを実際に動かして挙動を確かめてみてください。
-
C++で再帰を使わずに二分木のルートからリーフへの経路を出力するプログラム
このチュートリアルでは、与えられた二分木において、ルートノードからすべてのリーフノード(葉ノード)への経路を出力するプログラムを、C++で再帰を使わずに実装する方法を解説します。例として、次のような二分木を考えてみましょう。この二分木には、34・55・29という3つのリーフノードが存在します。したがって、ルートノードからリーフノードへの経路は3つあることになります。アルゴリズムのアプローチこの問題は、再帰に頼らない反復的なアプローチで解くことができます。手順は以下のとおりです。スタックを用いて、二分木を前順走査(先行順走査)します。走査の過程で、各ノードの親ノードへのポインタをマップ(std:
-
【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つの関数