はじめまして。

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

はじめまして。

#1

投稿記事 by さなび » 14年前

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

以下のプログラムでは、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);	//出力
}

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: はじめまして。

#2

投稿記事 by h2so5 » 14年前

私が試したところ無限ループになってしまい、出力ができませんでした。
本当にこのソースで間違いありませんか?

さなび

Re: はじめまして。

#3

投稿記事 by さなび » 14年前

あら。
#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);	//出力
}

アバター
lbfuvab
記事: 72
登録日時: 14年前

Re: はじめまして。

#4

投稿記事 by lbfuvab » 14年前

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: はじめまして。

#5

投稿記事 by さなび » 14年前

A*B=G*Lですか。
・・・数式で求めるって考えが無かったです。

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

閉鎖

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