最小公倍数を求める

単なるC言語int型では最小公倍数なんかはすぐに桁あふれしやすいかもしれないので計算しないほうがよいのかもしれないのでしょうけれども、最小公倍数に関するおぼえやすい等式があったりしたのでそれを使ってプログラムを書いてみる。

\large a \times b = gcm(a,b) \times lcm(a,b)

#include <stdio.h>
#include <stdlib.h>

/* 変数を交換する */
#define SWAP(type,a,b) {type tmp=a;a=b;b=tmp;}

/* 最大公約数 */
int gcm(int x, int y)
{
	int z;

	if ((x == 0) || (y == 0)) {
		return 0;
	}
	
	/* x を y で割った余りを z に代入し z が 0 以外のあいだループする */
	while((z = x % y) != 0)  {
		x = y; /* xにyを代入し */
		y = z; /* yに余りzを代入する */
	}
	
	return y;
}

/* 最小公倍数 lcm */
/* a * b = gcm(a, b) * lcm(a, b) */
int lcm(int a, int b)
{
	if ((a == 0) || (b == 0)) {
		return 0;
	}
	
	return a * b / gcm(a, b);
}

int main(int argc, char *argv[])
{
	int a = 123;
	int b = 456;
	printf("gcm = %d, lcm = %d\n", gcm(a, b), lcm(a, b));

	exit(EXIT_SUCCESS);
}