【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】

最初に最大公約数を求めるクラスを定義して、それを継承して最小公倍数を求めるプログラムを作ったのですがコンパイルはできても実行するとうまく作動しません。

理想の実行例は以下の通りです。
1st ? 12
2nd ? 8
Cookie=4
Late=24

ですが、1st? と 2nd? に数値を入力後に「Exception in thread "main" java.lang.ArithmeticException: / by zero」というエラーがどうしても出てきます。
なにが原因なのかさっぱり分からなくなり完全に詰まってしまいました・・・。
どなたか解る方がいらっしゃいましたら、どうか助けて下さい。
書いたソースコードは以下の通りです。

import java.io.*;
class Cookie{
private int aa, bb;
Cookie(int x, int y){
aa = x; bb = y;
}
public int cookie(){
int a = aa, b = bb; int r;
while(b > 0){
r = a%b;
a = b;
b = r;
}
return a;
}
}

class ChocoLate extends Cookie{
private int i,r;
ChocoLate(int x, int y){
super(x,y);
i = (x * y) /r;
}
public int late(){
return i;
}
}

class sample{
public static void main(String[] args) throws IOException{
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
System.out.print("1st?"); String str1 = br.readLine();
System.out.print("2nd?"); String str2 = br.readLine();
int a = Integer.parseInt(str1);
int b = Integer.parseInt(str2);
ChocoLate lg = new ChocoLate(a,b);
System.out.println("Cookie=" + lg.cookie());
System.out.println("Late=" + lg.late());
}
}

A 回答 (8件)

N04 さんの書かれた ものでいいですが、




あえて、質問者さんの意図をくめば

最小公倍数は 元の数字の積を最大公約数で割った数だから


public int getGCD() {
return (aa*bb)/getLCM();



って定義すればいいわけです。

この回答への補足

質問の意図を汲んでいただいて感謝します。
もう素人すぎて本当に申し訳ないのですが、御呈示頂いた定義は

public int late(){
return i;
}

の部分を

public int getGCD() {
return (aa*bb)/getLCM();


に変更するという意味合いでよろしいのでしょうか?
質問ばかりで本当に申し訳ありません。

補足日時:2012/08/09 02:30
    • good
    • 0

「掛けてから割る」よりも「割ってから掛ける」方が安全かな.



ど~でもいいかもしれんけど.
    • good
    • 0
この回答へのお礼

ヒントをありがとうございました。
参考にさせて頂きます。

お礼日時:2012/08/13 17:03

> 最小公倍数は 元の数字の積を最大公約数で割った数



がーん,知らなかった…
http://homepage1.nifty.com/moritake/sansu/6/05ba …

私にとって回答した以上の収穫でした,ありがとうございます。
    • good
    • 0

No5 の 差し替えは、 No4 さんのコードにたいしてです。

    • good
    • 0

ideone参照だけじゃなくソースを載せることにしました。



class Pair_PositiveNumber {
private int aa, bb;
Pair_PositiveNumber(int x, int y) {
if (x <= 0) { x = 1; }
if (y <= 0) { y = 1; }
if (x > y) {
aa = x; bb = y;
} else {
aa = y; bb = x;
}
}
public int getLCM() {
int a = aa, b = bb, r;
while (b > 0) {
r = a % b;
a = b;
b = r;
}
return a;
}
public int getGCD() {
int a = aa, b = bb;
while (a != b) {
if (a > b) {
b += bb;
} else {
a += aa;
}
}
return a;
}
}

class Q7633163 {
public static void main(String[] args) {
int a = 8;
int b = 12;
Pair_PositiveNumber pair = new Pair_PositiveNumber(a, b);
System.out.println("LCM = " + pair.getLCM());
System.out.println("GCD = " + pair.getGCD());
}
}

この回答への補足

ソースまで御呈示頂いて感謝いたします。
自分で書いていて本当に迷子になってしまいました。
最大公約数と最小公倍数の継承になぜ?という部分なのですが、自分でもよく解らずに教科書の問いに挑戦した次第でございます。
さらに、キーボード入力による出力表示も上乗せで出題されていてパニック状態です。。。

補足日時:2012/08/09 02:36
    • good
    • 0
この回答へのお礼

わざわざソースまで書き出して下さったことに本当にありがとうございました。
引き続き勉強すると共に参考にさせて頂きます。

お礼日時:2012/08/13 17:02

最大公約数と最小公倍数の関係が「なんで継承?」(ANo.2) という意見に私も賛成。



http://ideone.com/XCUh3
    • good
    • 0

なんかめちゃくちゃですね。






i = (x * y) /r; の r なにも意味をなしません。

なんで、継承する必要が???

この回答への補足

なにがどうめちゃくちゃなのかさえ分からないくらいど素人な故に本当に申し訳ございません・・・。

補足日時:2012/08/09 02:37
    • good
    • 0
この回答へのお礼

めちゃくちゃなソースに対してのアドバイス感謝します。
ありがとうございました。

お礼日時:2012/08/13 17:00

こんにちは。



 私もJavaは詳しくありませんが、実行してみました。

 結果)

1st?8
2nd?24
Exception in thread "main" java.lang.ArithmeticException: / by zero
at LcmGcm.<init>(sample.java:22)
at sample.main(sample.java:37)

 ここで1行目のエラーは「0で除算した」と言う意味です。
 2行目以降はエラーの発生に関連する行です。

 22行目でrで割っていますが、初期化していないのが原因ではないでしょうか。

では。

この回答への補足

ここで1行目のエラーは「0で除算した」と言う意味です。
 2行目以降はエラーの発生に関連する行です。
           ↑
なるほど!こんなエラーは初めて見たので勉強になりました。
ありがとうございました。

補足日時:2012/08/09 02:38
    • good
    • 0
この回答へのお礼

お礼遅くなりました。
参考にさせて頂きました。
ありがとうございました。

お礼日時:2012/08/13 16:59

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