【C言語】演算子を使わずに2つの数値の合計を求めるプログラム
この記事では、C言語のプログラムにおいて+演算子などの演算子を一切使わずに、2つの数値の合計を求めて出力する方法を解説します。
一見すると手強そうな問題ですが、printf()関数の「最小フィールド幅」指定を利用することでエレガントに解決できます。printf()では、書式指定子の * を使うことで、可変引数からフィールド幅(出力する最小文字数)を動的に受け取ることができます。例えば、「Hello」という文字列の前にx個の空白を挿入したい場合は、次のように記述します。
サンプルコード
#include<stdio.h>
main() {
int x = 10;
printf("%*cHello", x, ' ');
}このコードでは、%*c がフィールド幅 x を受け取り、その幅いっぱいに空白文字(' ')が出力されます。その直後に「Hello」が続くため、結果として10個の空白の後に「Hello」が表示されます。
実行結果
Hello
仕組みを足し算に応用する
それでは、この仕組みをどのように足し算に応用するのかを見てみましょう。入力としてxとyを受け取り、x + y の結果を求めるのが目標です。
ポイントは次の2点です。
printf("%*c%*c", x, ' ', y, ' ')と書くと、x個の空白に続けてy個の空白が出力されるprintf()は実際に出力した文字数を戻り値として返す
つまり、出力される空白は合計で x + y 個になるため、printf() の戻り値をそのまま合計値として利用できるのです。
サンプルコード
#include<stdio.h>
int add(int x, int y) {
int len;
len = printf("%*c%*c", x, ' ', y, ' ');
return len;
}
main() {
int x = 10, y = 20;
int res = add(x, y);
printf("\nThe result is: %d", res);
}実行結果
The result is: 30
注意点
- この手法は非負の整数に対してのみ正しく機能します。フィールド幅に負の値を指定すると左詰め扱いになるため、負の数の加算には対応していません。
main()は現行のC標準ではint main(void)と宣言し、最後にreturn 0;を返すのが推奨されます。
このように、printf() のフィールド幅指定と戻り値を組み合わせることで、加算演算子を使わずに2つの数値の合計を求めることができます。C言語の標準ライブラリへの深い理解があればこそ実現できる、興味深いテクニックと言えるでしょう。
-
再帰を使用してN個の数値の合計を求めるJavaプログラム
本記事では、再帰(リカージョン)を使ってN個の数値の合計を求める方法について解説します。再帰関数とは、特定の条件(ベースケース)が満たされるまで、自分自身を何度も呼び出す関数のことです。 再帰とは、自己相似的な形式で処理を繰り返す手法です。プログラミング言語において、ある関数の内部から同じ関数自身を呼び出すことができる場合、その呼び出しを「再帰呼び出し」と呼びます。 多くのプログラミング言語では、スタックを用いて再帰を実装しています。一般に、ある関数(呼び出し元)が別の関数(呼び出し先)や自分自身を呼び出すと、実行の制御は呼び出し元から呼び出し先へ移ります。このとき、呼び出し元から呼び出し先
-
【Java】2つの数値の最大公約数(GCD)を求めるプログラムの書き方
この記事では、Javaで2つの数値の最大公約数(GCD:Greatest Common Divisor)を求める方法について解説します。最大公約数とは、2つの数値をどちらも余りなく割り切ることができる最大の整数のことです。 GCDの求め方:実行例 以下に具体的な実行例を示します。 入力 入力値が次のとおりであるとします。 値1 : 18 値2 : 24 出力 期待される出力は次のとおりです。 2つの数値のGCD : 6 アルゴリズム GCDを求める基本的な手順は以下のとおりです。 ステップ1 - 開始 ステップ2 - 3つの整数変数 input_1、input_2、gcd を宣言する ステップ