小テスト (7月1日)
問題1 (ユークリッドの互除法)
ある2数の最大公約数を、次のような方法で効率的に計算できる。
a ≥ bを自然数とし、a ÷ bを考え、商がc、あまりがdだったとする。
- 割り切れた (d==0) なら、bが最大公約数。
- 割りきれなかったなら、「aとbの最大公約数」 = 「bとdの最大公約数」であり、
b > dなのでaをb, bを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日)
/