プロが教える店舗&オフィスのセキュリティ対策術

javaを勉強し始めて3ヶ月も経っていないド素人です。質問したいのは3つの整数を素因数分解を用いた最大公約数と最小公倍数を表示させるプログラムで 「// ?」 の所に何を入力すればいいのかわからい状態です。「// ?」に何を入力すれば良いのでしょうか?
あと「// ? 」以外にもおかしな所があれば教えてもらえるとうれしいです。

public class Main {
public static final int N = 1000;
public static final int COUNT = 168;
public static void main(String args[]){
int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]);
int c = Integer.parseInt(args[2]);

int[] prime = new int[COUNT];

int count = 0;
for (int i = 0; i < N; i++) {
if (isPrime(i)) {
prime[count] = i;
count++;
}
}

int gcd = gcd3(a, b, c, prime);
System.out.println("Greatest common divisor of " + a + " and " + b + " and " + c + " : " + gcd);
int lcm = lcm3(a, b, c, prime);
System.out.println("Least common multiple of " + a + " and " + b + " and " + c + " : " + lcm);
}

public static boolean isPrime(int num){
if (num <= 1) {
return false;
} else {
for (int i = 2; i < num - 1; i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
}
public static int[] primeFact(int num, int[] prime){
int[] Fact = new int[N];
for (int i = 0; i < prime.length; i++) {
if (num % prime[i] == 0) {
while (num % prime[i] == 0) {
Fact[i] += 1;
num = num / prime[i];
}
}
}
return Fact;
}

public static int gcd3(int a, int b, int c, int[] prime){
// ?
}


public static int lcm3(int a, int b, int c, int[] prime){
// ?
}

}

質問者からの補足コメント

  • (1)a,b,cは3つの整数でprimeは素数と考えてるのですが正しいでしょうか?

    (2)a,b,cを素因数分解→a,b,cの共通の素数(指数が1の数字)を判別(if文?)する→判別した素数を掛けるといった感じでしょうか?
    最大公約数なら primeFact で格納したFact[i]の指数1の共通素数を if文で探して掛ければいけるかな?と思ったのですがgcd3の中でFact[i]をどう使えばいいかよくわかってない感じです。

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/04/26 19:46

A 回答 (3件)

a を素因数分解 → factA


b を素因数分解 → factB
c を素因数分解 → factC
factA/B/C より 2 の指数の最大値/最小値 → factD の 2 の指数
factA/B/C より 3 の指数の最大値/最小値 → factD の 3 の指数
...
factA/B/C より 997 の指数の最大値/最小値 → factD の 997 の指数
factD を数値に戻す → 最大公約数/最小公倍数

それ以外の点として

Nまでの素数の配列が new int[COUNT]
素因数分解の配列が new int[N]
なのはおかしい
    • good
    • 0

……というか、「a, b, c の最大公約数」=「「a, b の最大公約数」と c の最大公約数」(も同様)だし、2項の最大公約数は素因数分解しなくてもユークリッドの互除法で出せてその結果から2項の最小公倍数が計算できるから、2項づつを順次計算していけば素因数分解した結果なんていらないと思うんですが、何が何でも素因数分解しなくてはならない理由はございますでしょうか。


http://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%BC% …
    • good
    • 0

例えば。


public static int gcd3(int a, int b, int c, int[] prime){
// ?
}
ですが。

(1) a,b,c, prime の4つの引数について。
それぞれが何であるか、理解できていますか?

(2)gcd3という名前から、3値の最大公約数を求める関数だと思われます。
では、 // ? の部分の内容を『日本語』で書けますか?
※ 英語や他の言語が得意なら、その言語でも結構です。
数学の試験のときに、紙と鉛筆で解こうとしたどうするか、を考えてみるのもよいでしょう。


目的から
 public static int gcd3(int a, int b, int c, int[] prime){
  return 「3つの整数を素因数分解を用いた最大公約数」
 }
等と書ければ解決ですが、そうではありません。

よって、「3つの整数を素因数分解を用いた最大公約数」をより詳細にしていく必要があります。
例えば

 public static int gcd3(int a, int b, int c, int[] prime){
  「3つの整数を素因数分解」
  return 「3つの素因数分解の結果から最大公約数を求める」
 }

これでも不十分なので、それぞれをさらに詳細にしていきます。
...
とこれを繰り返して、言語で表現できるところまでにするのがプログラミングです。
この回答への補足あり
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!