C言語初歩 最大公約数について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: C言語初歩 最大公約数について

Re: C言語初歩 最大公約数について

#3

by 若葉マークぺらひこ » 7年前

返信が遅れて申し訳ありません!
指摘して頂いた箇所を直したところ、無事実行できました。
とても丁寧かつ簡潔な解説をありがとうございます!

Re: C言語初歩 最大公約数について

#2

by かずま » 7年前

若葉マークぺらひこ さんが書きました:以下の文で約分できずに困っています。この文ではiが最大公約数のつもりです。
そう思うんだったら、i = x / y; の文の次に
printf("i = %d\n", i); を入れて、コンパイルして、実行し、
分子に 8、分母に 12 を入れてみましょう。
最大公約数になっていますか?

次にやることですが、
while文の中で、x と y の値を変更していますよね。
そこで、printf("x = %d, y = %d\n", x, y); を挿入して、
また実行してみてください。
最大公約数は、y だということが分かります。

x と y は、もう分子と分母ではありません。
だから、
 c.bunsi = x / c.kouyaku;
 c.bunbo = y / c.kouyaku;
と書くのは間違いです。
 c.bunsi = c.bunsi / c.kouyaku;
 c.bunbo = c.bunbo / c.kouyaku;
または、
 c.bunsi /= c.kouyaku;
 c.bunbo /= c.kouyaku;
と書くべきです。

次に、結果を return c で返していますが、
18行目の kouyakusuu(c) の呼び出しでは、結果を受け取っていません。
c = kouyakusuu(c); と書くべきです。

C言語初歩 最大公約数について

#1

by 若葉マークぺらひこ » 7年前

こんにちは。私はC言語初心者です。
私は構造体と自作関数を使って分数を約分するプログラムを作ろうとしています(何故そんな面倒なやり方をするのかはどうか聞かないで下さい)。
そこでユークリッドの互除法を使おうとしているのですが、以下の文で約分できずに困っています。この文ではiが最大公約数のつもりです。
自分ではこれで動くと思っているのに動きません。どうか間違っている箇所を教えて下さい。
コンパイラ(と言うものなのでしょうか?)はpaiza.IOです。

コード:

#include <stdio.h>

typedef struct {
	int bunsi;
	int bunbo;
	int kouyaku;
}bunsuu;

bunsuu kouyakusuu(bunsuu c);

int main() {
	bunsuu c;
	int a;
	printf("分子を入力して下さい。\n");
	scanf("%d", &c.bunsi);
	printf("分母を入力して下さい。\n");
	scanf("%d", &c.bunbo);
	kouyakusuu(c);
	printf("結果は%d\n   --\n   %d  です。\n",c.bunsi,c.bunbo);
	scanf("%d",&a);
	return 0;
}

bunsuu kouyakusuu(bunsuu c) {
	int i;
	int x=c.bunsi;
	int y=c.bunbo;
	if (x<y) {
		i = x;
		x = y;
		y = i;
	}
	i = x % y;
	while (i != 0) {
		x = y;
		y = i;
		i = x % y;
	}
	i = x / y;
	c.kouyaku = i;
	c.bunsi = x / c.kouyaku;
	c.bunbo = y / c.kouyaku;
	return c;
}

ページトップ