ページ 11

はじめまして。

Posted: 2011年4月24日(日) 13:51
by さなび
はじめまして。学校で出た課題で躓いてます。
「三つの値の最小公倍数を求めよ。ただし余り(%)を使ってはならない。」
という課題が出て、以下のようにプログラムを組んでみたのですが、うまくいきません。

以下のプログラムでは、7,5,3と入力すると出力は105となりますが、3,5,7と入力すると33と出力されます。
また開発はvisual stadio 2008で行っています。

コード:

#include <stdio.h>

#include <stdio.h>

void main()
{
	int a, b, c;	//要素a, b,c
	int i, j, k=0;	//ループカウンタ

	scanf("%d", &a);	//入力
	scanf("%d", &b);
	scanf("%d", &c);

	for(i=1; i*a!=k*c; i++){
		for(j=1; i*a>=j*b; j++){
			if(i*a==j*b){
				for(k=1; i*a>k*c; k++);
			}
			if(i*a==k*c){
			break;
			}
		k=0;
		}
	}

	printf("\n%d", i*a);	//出力
}

Re: はじめまして。

Posted: 2011年4月24日(日) 15:03
by h2so5
私が試したところ無限ループになってしまい、出力ができませんでした。
本当にこのソースで間違いありませんか?

Re: はじめまして。

Posted: 2011年4月24日(日) 15:22
by さなび
あら。
#includeが二行ありますね(汗

公倍数なので入力には実数しか使えません。ソースはこの通りだと思うのですが・・・すみません。
一応、下にもう一度貼っておきます。

コード:

#include <stdio.h>

void main()
{
	int a, b, c;	//要素a, b,c
	int i, j, k=0;	//ループカウンタ

	scanf("%d", &a);	//入力
	scanf("%d", &b);
	scanf("%d", &c);

	for(i=1; i*a!=k*c; i++){
		for(j=1; i*a>=j*b; j++){
			if(i*a==j*b){
				for(k=1; i*a>k*c; k++);
			}
			if(i*a==k*c){
			break;
			}
		k=0;
		}
	}

	printf("\n%d", i*a);	//出力
}

Re: はじめまして。

Posted: 2011年4月24日(日) 15:40
by lbfuvab
lcm(a,b,c) = lcm(lcm(a,b),c)は自明であり(lcm = least common multiple = 最小公倍数)
lcm(x,y) = x*y/gcd(x,y)なので(gcd = 最大公約数)
つまり、gcdが実装出来たら良いわけです。

原始的なユークリッドの互除法に従って

コード:

int gcd(int x,int y){		//x,y>0が前提
	if(x > y)
		return gcd(y,x);
	else if(x == y)
		return x;
	else
		return gcd(x,y-x);
}
でも良いですし、もう少し改良して

コード:

int gcd(int x,int y){		//x,y>0が前提
	if(x > y)
		return gcd(y,x);
	else if(x == y)
		return x;
	else
		return gcd(y-(y/x)*x,x);
}
でも良いでしょう。
後は、自分で考えてください。

Re: はじめまして。

Posted: 2011年4月24日(日) 16:21
by さなび
A*B=G*Lですか。
・・・数式で求めるって考えが無かったです。

ありがとうございました。早速やってみますっ