(C++)二つの整数値xとyの最大公約数をユークリッドの互除法で求める関数

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

(C++)二つの整数値xとyの最大公約数をユークリッドの互除法で求める関数

#1

投稿記事 by じゃが » 16年前

また分からない問題に直面してしまったので質問します。

C++で二つの整数値xとyの最大公約数をユークリッドの互除法を使って求めたいのですが
int gcd(int x, int y);

一応、xが大きければ求めることはできたのですがyの値を大きくするとエラーになってしまいます。
どなたかご指摘お願いしますm(_ _)m
#include<iostream>
#include<iomanip>
#include<ctime>
using namespace std;

int gcd(int x,int y);

int main(){
	int x,y;

	cout << "xの値:"; cin >> x;
	cout << "yの値:"; cin >> y;

	cout << "xとyの最大公約数をユークリッド互除法で求めると" << gcd(x,y) << "です。\n";

	return 0;
}

int gcd(int x, int y){
	int t = 0;
	t = (x + y) / 2;
	if(x && y != t){
	if(x > y)
		return gcd(x = x - x / y * y,y);
	else if (x < y)
		return gcd(x,y = y - y / x * x);
	}
	else if(x > y)
		return t = x;
	else
		return t = y;
}
小数点以下切捨ての方法が分からないのでintで整数にしているのですが・・・。
無駄な部分・簡単にできる部分もありましたらご指摘お願いします。

以下、問題の文のコピーです。
ユークリッドの互除法は、二つの整数を長方形の変の長さとする。短いほうの辺を一辺とする正方形で埋め尽くす。
残った長方形に対して同じ操作を繰り返す。正方形のみで埋め尽くされたとき、その正方形の辺の長さが最大公約数である。

fatens

Re:(C++)二つの整数値xとyの最大公約数をユークリッドの互除法で求める関数

#2

投稿記事 by fatens » 16年前

#include <math.h>

int gcd(double x, double y)
{
	int m = (int)floor(x);
	int n = (int)floor(y);
	int r;

	do {
		r = m % n;
		m = n;
		n = r;
	} while (r != 0);

	return m;
}
こんなのでどうでしょう?
floor関数(math.hをインクルード)で小数点以下を切り捨てています。
一応 y > x でも計算できるようになっているはずです。
コメント入れてませんが、デバッグして動きを確認してみてください。

あと、エラー処理は入れていないので、yに0などをわたさないでください。

non

Re:(C++)二つの整数値xとyの最大公約数をユークリッドの互除法で求める関数

#3

投稿記事 by non » 16年前

問題文に対し、
「じゃが」さんが使われている、tの意味がわかりません。
それに、小数点以下がどうのこうのって????

もしかして、余りを求める演算子をご存じないのでは?
x % y ですよ。

non

Re:(C++)二つの整数値xとyの最大公約数をユークリッドの互除法で求める関数

#4

投稿記事 by non » 16年前

簡単に書きたいなら、
int gcd(int x, int y)
{
	return y==0 ? x:gcd(y,x % y);
}

hss12

Re:(C++)二つの整数値xとyの最大公約数をユークリッドの互除法で求める関数

#5

投稿記事 by hss12 » 16年前

再帰関数を用いないのならこんな感じでしょうか。
int gcd(int x, int y)
{
    int temp;
    while (y != 0) {
        temp = y;
        y = x % y;
        x = temp;
    }
    return (x);
}

じゃが

Re:(C++)二つの整数値xとyの最大公約数をユークリッドの互除法で求める関数

#6

投稿記事 by じゃが » 16年前

なるほど、あまりを求める方法でよかったのですか・・・。
そこまで簡単にできるなんて@@;
動作しました。今回はありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る