ロゴ ロゴ

最大公約数、最小公倍数を同時に求める関数

こんにちは、じゃた。です。もう3度目の課題お手伝いシリーズです。言語はCです。

今回のプログラムについて

 入力された2つの自然数から “最大公約数” と “最小公倍数” を計算するプログラムを作成します。その際、最大公約数、最小公倍数を “同時に” 計算する関数を作成することが条件です。
 なぜ同時に計算するというのを強調したかと言いますと、2つの値を返り値として返すことはできないからです。つまり、今回のお題ではその問題をどう解決しますか?ということを聞かれているわけですね。学生の内はこうやって自動的に問題提示されることが圧倒的に多いですが、社会へ出てからもそれが続くわけではありません。当たり前ですが。問題をしっかり自分で見つける能力を身につけていきたいものですね。

プログラム

 計算方法について記述しませんでしたが、こちらも指定されていたので言われるがままに脳死で書きました。自分で考えたわけではないです。

#include<stdio.h>
void gcdlcm(int, int, int*, int*);

int main(void){

    int x, y;
    printf("x > ");
    scanf("%d",&x);
    printf("y > ");
    scanf("%d",&y);

    int gcd = 0, lcm = 0;
    gcdlcm(x, y, &gcd, &lcm);
    printf("最大公約数:%d\n最小公倍数:%d\n", gcd, lcm);

    return 0;
}

void gcdlcm(int a, int b, int* gcd, int* lcm){
    //最大公約数を求める
    int div = 1;
    if(a >= b) div = b;
    else div = a;
    while(div != 1){
        if((a%div == 0) && (b%div == 0)) break;
        div--;
    }
    *gcd = div;

    //最小公倍数を求める
    int m = 1, n = 1;
    while(m != -1){
        if(a*m == b*n) break;
        if(a*m < b*n) m++;
        else if(a*m > b*n) n++;
    }
    *lcm = a*m;
}

34行目のif文についてですが、else ifにしても変わりませんが、個人的に “最小公倍数が見つからなかった場合で、~の時” よりも、m、n増加の条件だけでまとめた “~の時、じゃなくて~の時” の方が分かりやすかったのでifを分けました。個人の好みです。駄目だったら以後気を付けますということで。

おわりに

最後まで見てくれてありがとうございます!See You Next Time!

コメント入力

関連サイト