小テスト (7月1日)


問題1 (ユークリッドの互除法)

ある2数の最大公約数を、次のような方法で効率的に計算できる。
a ≥ bを自然数とし、a ÷ bを考え、商がc、あまりがdだったとする。 このアルゴリズムによって2つの引数の最大公約数を計算する関数gcdを作成せよ。
#include <stdio.h>

int gcd(int a, int b) {
    /* ここを書く */
}

int main(void)
{
    printf("%d\n", gcd(48, 24));
    printf("%d\n", gcd(36, 54));
    printf("%d\n", gcd(25, 15));
    printf("%d\n", gcd(54, 27));
    printf("%d\n", gcd(54, 48));
    printf("%d\n", gcd(64, 72));
    printf("%d\n", gcd(90, 80));
    printf("%d\n", gcd(12, 30));

    return 0;
}

問題2 (分数の計算)

分子 num (=numerator)、分母 den (=denominator) をそれぞれint型で持つ 構造体rationalを作り、分数の加減乗除を行うプログラムを作れ。 (加算だけ書いたので、同じ要領で減算、乗算、除算を作り、動作を確かめよ。)
#include <stdio.h>
#include <stdlib.h>

int gcd(int a, int b) {
    /* 問1 */
}

int gcd_abs(int a, int b) {
    return gcd(abs(a), abs(b));
}

struct rational {
    int num;
    int den;
};

struct rational rational_add(struct rational a, struct rational b)
{
    struct rational c;
    int tmp;

    c.num = a.num * b.den + b.num * a.den;
    c.den = a.den * b.den;

    tmp = gcd_abs(c.num, c.den);
    c.num /= tmp;
    c.den /= tmp;

    return c;
}

struct rational rational_sub(struct rational a, struct rational b)
{
    /* ここを書く */
}

struct rational rational_mul(struct rational a, struct rational b)
{
    /* ここを書く */
}

struct rational rational_div(struct rational a, struct rational b)
{
    /* ここを書く */
}

void rational_print(struct rational a)
{
    if (a.den > 0) {
        printf("%d/%d\n", a.num, a.den);
    } else {
        printf("%d/%d\n", -a.num, -a.den);
    }
}

int main(void)
{
    struct rational x, y, z;

    x.num = 1; x.den = 3;
    y.num = 1; y.den = 2;
    z = rational_add(x, y);
    rational_print(z);
    z = rational_sub(x, y);
    rational_print(z);
    z = rational_mul(x, y);
    rational_print(z);
    z = rational_div(x, y);
    rational_print(z);

    return 0;
}

小テスト (7月1日) /