#include <stdio.h>
#include <stdlib.h> /* exit() */
/* 素因数分解 */
void factrize(int x){
int d, q;
printf("%8d = ", x );
/* 2で割れるだけ割る */
while(x >= 4 && x % 2 == 0){
printf("2 * ");
x /= 2;
}
/* 順番に3以上の奇数で割れるだけ割る */
d = 3;
while(q = x/ d, q >= d ){
if (x % d == 0){ /* 割り切れたら */
printf("%d * ", d); /* その数を表示に追加 */
x = q;
}else{ /* 割り切れなかったら */
d += 2; /* 次の奇数へ */
}
}
printf("%d\n", x);
}
/* 入力値のチェック */
void chk_val(int *v1, int *v2){
int tmp;
/* どちらかが0か0以下なら計算中止 */
if((*v1 <= 0)||(*v2 <= 0)){
printf("不正な値が入力されました。終了します\n");
exit(1); /* プログラム終了 */
}
/* どちらかが32768以上なら計算中止 */
if((*v1 >= 32768)||(*v2 >= 32768)){
printf("入力値が大きすぎます。終了します\n");
exit(1); /* プログラム終了 */
}
/* v2 > v1 なら値を入換え */
if(*v2 > *v1){
tmp = *v2;
*v2 = *v1;
*v1 = tmp;
}
/* printf("v1:%d, v2:%d\n", *v1, *v2); */
}
/* 最大公約数 */
int gcd(int a,int b){
int c;
while(c = a % b, c > 0){
/* printf("c:%d\n", c); */
a = b % c;
b = c;
}
return b;
}
/* 最小公倍数 */
int lcm(int a,int b){
int c, d;
c = gcd(a, b);
/* ret_val = (a * b) / c; */
d = (a / c) * b;
return d;
}
/* メインプログラム */
int main(void) {
int kone,ktwo;
int aone;
int atwo;
printf("1つ目の値を入力して下さい:");
scanf("%d", &kone);
printf("2つ目の値を入力して下さい:");
scanf("%d",&ktwo);
chk_val(&kone, &ktwo);
printf("素因数分解:\n");
factrize(kone);
factrize(ktwo);
aone = gcd(kone,ktwo);
atwo = lcm(kone,ktwo);
printf("最大公約数は、%dです。\n最小公倍数は、%ldです。\n", aone, atwo);
return 0;
}