ページ 11

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

Posted: 2009年4月03日(金) 01:47
by じゃが
また分からない問題に直面してしまったので質問します。

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で整数にしているのですが・・・。
無駄な部分・簡単にできる部分もありましたらご指摘お願いします。

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

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

Posted: 2009年4月03日(金) 09:08
by fatens
#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などをわたさないでください。

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

Posted: 2009年4月03日(金) 09:09
by non
問題文に対し、
「じゃが」さんが使われている、tの意味がわかりません。
それに、小数点以下がどうのこうのって????

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

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

Posted: 2009年4月03日(金) 09:10
by non
簡単に書きたいなら、
int gcd(int x, int y)
{
	return y==0 ? x:gcd(y,x % y);
}

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

Posted: 2009年4月03日(金) 18:50
by hss12
再帰関数を用いないのならこんな感じでしょうか。
int gcd(int x, int y)
{
    int temp;
    while (y != 0) {
        temp = y;
        y = x % y;
        x = temp;
    }
    return (x);
}

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

Posted: 2009年4月03日(金) 19:26
by じゃが
なるほど、あまりを求める方法でよかったのですか・・・。
そこまで簡単にできるなんて@@;
動作しました。今回はありがとうございました。