質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

7806閲覧

Java言語 帯分数と整数を求めたいです。

ssssa

総合スコア39

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/07/11 15:38

2つの分数同士の足し算をし、その結果を分数で表示するプログラムを作りなさい。
このとき、分子、分母共に最大値が10で、最小値は分母が2、分子が1とする。それらの数値をランダムに発生させ、以下のように結果を表示させなさい。
ただし、計算結果は、分子と分母がきちんと約分されていることとする。
また、分子が分母の数で割り切れる場合は、整数として表示するものとする。


1/5 + 2/3 = 13/15 ← 通常のケース
2/3 + 3/8= 1.1/24 ← 帯分数になるケース
1/6 + 1/3= 1/2 ← 約分されるケース
1/2 + 1/2 = 1 ← 整数になるケース

public class Prob8_6 {

/** * @param args */ public static void main(String[] args) { int a = (int) (Math.random() * 10) + 1; int b = (int) (Math.random() * 10) + 2; int c = (int) (Math.random() * 10) + 1; int d = (int) (Math.random() * 10) + 2; System.out.println("分子" + a); System.out.println("分母" + b); System.out.println("分子" + c); System.out.println("分母" + d); int e = (a * b) + (c * d); int o = e; int f = (b * d); int p = f; System.out.println(""); System.out.println("-----------通分-----------"); System.out.println("分子" + e); System.out.println("分母" + f); System.out.println(a + "/" + b + "+" + c + "/" + d + "=" + e + "/" + f); System.out.println(""); System.out.println("----------約分-------------"); if (e < f) { int tmp = e; e = f; f = tmp; } int r = e % f; while (r != 0) { e = f; f = r; r = e % f; } System.out.println("最大公約数" + f); System.out.println("分子" + o / f); System.out.println("分母" + p / f); System.out.println(" "); System.out.println("--------帯分数----------"); if (e % f != 0) { System.out.println(e + "/" + f); } System.out.println(" "); System.out.println("--------整数-------------"); if (e == f) { System.out.println(e); } }

}
上記のように書いてみましたが帯分数と整数表示が何も表示されずどこをなおせばいいのかわからないです。
どなたかご教示いただけないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/07/12 00:17 編集

https://teratail.com/help/avoid-asking >何かを作りたいのでコードを書いてほしい、学校の課題を解いてほしい等の質問は、具体的にプログラミングで困っている質問ではないと考え、推奨していません。
guest

回答3

0

java

1if (e % f != 0) 2if (e == f)

このコードに到達する時点でeとfは互除法をやった残りかすだということに注意してください。
前者は必ずeがfで割り切れる状態なので、このifには入れません。
後者は最初の段階でe==f、つまり2つの分数の和が1になるときしか成立しません。

投稿2018/07/11 16:19

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ssssa

2018/07/12 13:32

ご指摘また的確な修正内容ありがとうございます。 変数名が何を意味するのかしっかり考え問題を解きたいと思います。 見ていただき本当にありがとうございました。
guest

0

random で数値を設定していると、テストやデバッグがしにくいです。
数値を設定する部分と、計算・表示をする部分を別けてみました。

java

1public class Prob8_6 { 2 public static void main(String[] args) { 3 int n1 = (int) (Math.random() * 10) + 1; 4 int d1 = (int) (Math.random() * 10) + 1; 5 int n2 = (int) (Math.random() * 10) + 1; 6 int d2 = (int) (Math.random() * 10) + 1; 7 8 my_task(n1, d1, n2, d2); 9 // テスト 10 my_task(1, 3, 1, 2); // 1/3 * 1/2 = 5/6 11 my_task(1, 3, 2, 3); // 1/3 + 2/3 = 1 12 my_task(1, 3, 3, 4); // 1/3 + 3/4 = 1 と 1/12 13 my_task(1, 12, 3, 18); // 1/12 + 3/18 = 1/4 14 } 15 16 public static void my_task(int n1, int d1, int n2, int d2) { 17 System.out.println("\n-----------通分での足し算-----------"); 18 int n3 = (n1 * d2) + (n2 * d1); 19 int d3 = (d1 * d2); 20 System.out.println("" + n1 + "/" + d1 + " + " + n2 + "/" + d2 + " = " + n3 + "/" + d3); 21 22 System.out.println("----------約分して 整数、帯分数, 分数で表示する-------------"); 23 int cd = gcd(n3, d3); 24 System.out.println("最大公約数 " + cd); 25 26 int n4 = n3 / cd; 27 int d4 = d3 / cd; 28 if (n4 % d4 == 0) { 29 System.out.println(" --------整数-------------"); 30 System.out.println(n4 / d4); 31 } else if (n4 > d4) { 32 System.out.println(" --------帯分数----------"); 33 int n = n4 / d4; 34 System.out.println("" + n + " と " + (n4 - n * d4) + "/" + d4); 35 } else { 36 System.out.println(" --------分数----------"); 37 System.out.println("" + n4 + "/" + d4); 38 } 39 } 40 41 // 最大公約数を求める (ユークリッドの互除法) 42 public static int gcd(int a, int b) { 43 if (a < b) { 44 // 引数の大小入替 (a >= b にする) 45 int temp = a; 46 a = b; 47 b = temp; 48 } 49 if (b < 1) { 50 return -1; 51 } 52 if (a % b == 0) { 53 return b; 54 } 55 return gcd(b, a % b); 56 } 57}

実行例

-----------通分での足し算----------- 7/9 + 6/8 = 110/72 ----------約分して 整数、帯分数, 分数で表示する------------- 最大公約数 2 --------帯分数---------- 1 と 19/36 -----------通分での足し算----------- 1/3 + 1/2 = 5/6 ----------約分して 整数、帯分数, 分数で表示する------------- 最大公約数 1 --------分数---------- 5/6 -----------通分での足し算----------- 1/3 + 2/3 = 9/9 ----------約分して 整数、帯分数, 分数で表示する------------- 最大公約数 9 --------整数------------- 1 -----------通分での足し算----------- 1/3 + 3/4 = 13/12 ----------約分して 整数、帯分数, 分数で表示する------------- 最大公約数 1 --------帯分数---------- 1 と 1/12 -----------通分での足し算----------- 1/12 + 3/18 = 54/216 ----------約分して 整数、帯分数, 分数で表示する------------- 最大公約数 54 --------分数---------- 1/4

投稿2018/07/21 03:33

編集2018/07/21 08:51
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ssssa

2018/07/21 04:45

わかりやすくご丁寧な回答ありがとうございます。参考にさせていただきました。 本当にありがとうございます。
guest

0

ベストアンサー

こんにちは、

まず、コードを見て気づいたところですが、

1

Java

1 System.out.println("分子" + a); 2 System.out.println("分母" + b); 3 System.out.println("分子" + c); 4 System.out.println("分母" + d); 5 6int e = (a * b) + (c * d); 7

とありますが、通分の際の分子を求める式が間違っています。
a / b + c / d の計算をするならば、int e = a * d + b * cです。

2.変数名をもっとわかりやすいものにしてください。a,b,c,d,e,fだと後でコードを見たときにその変数が何を指しているのかわからなくなる恐れがあります。例えば、帯分数の整数部分をintegerPartなどにするといいでしょう。

では、私がコードを書く際に工夫した点を述べます。

1.a,b,c,dを配列にする。
配列にすることで、

java

1for(int i = 0; i < 4; i++){ 2 data[i] = rand.nextInt(10) + 1 + i % 2; 3}

と簡潔に書くことができます。

また、その後の通分の式も

java

1for(int i = 0; i < 2; i++){ 2 num += data[i] * data[3 - i]; 3 den *= data[2 * i + 1]; 4}

のように一つの式が短くなるメリットがあります。

2.約分

最大公約数を求める際、その個所をメソッドに切り出しました。

3.後は、答えが真分数になるのか、整数になるのかをif文を使って分岐させればよいでしょう。

約分は済ませたので答えは
(i)整数
(ii)真分数
(iii)帯分数
の3つに場合分けできます。

それぞれの条件は以下の通りなのでこれをもとにif文で分岐させましょう。

整数部分分子
整数0
真分数0
帯分数

細かいところですが、質問欄にある 帯分数を表示するとき 1.1/24 と書いてありますが、
「 1 と 1 / 24 」または、「 1 and 1 / 24 」と書くことをおすすめします。
初見、"1.1"という小数を24で割ったものと勘違いしました。(小数点は小数を表すときに使うので)

以下、私が書いたソースコードを載せておきます。長々と書いたのでどこか間違ったことを
書いているかもしれません。その時はご指摘ください。

java

1import java.util.Random; 2 3public class Main { 4 public static void main(String[] args){ 5 // Your code here! 6 Random rand = new Random(); 7 int []data = new int[4]; 8 String []text = {"分子","分母"}; 9 for(int i = 0; i < 4; i++){ 10 data[i] = rand.nextInt(10) + i % 2 + 1; 11 //System.out.println(text[i % 2] + (i / 2 + 1) + ":" + data[i]); 12 } 13 int num = 0; //分子 14 int den = 1; //分母 15 16 for(int i = 0; i < 2; i++){ 17 num += data[i] * data[3 - i]; 18 den *= data[2 * i + 1]; 19 } 20 int integerPart = num / den; //整数部分 21 num = num % den; 22 23 //System.out.println(num + " " + den); 24 int tmp = my_gcd(num,den); 25 num /= tmp; 26 den /= tmp; 27 28 System.out.print(data[0] + " / " + data[1] + " + " + data[2] + " / " + data[3] + " = "); 29 30 if(integerPart > 0){ 31 System.out.print(integerPart); 32 if(num > 0){ 33 System.out.print(" and "); 34 } 35 } 36 if(num > 0){ 37 System.out.println(num + " / " + den); 38 } 39 40 41 } 42 public static int my_gcd(int a, int b){ 43 44 int r = a % b; 45 while (r != 0) { 46 a = b; 47 b = r; 48 r = a % b; 49 } 50 return b; 51 } 52}

投稿2018/07/12 08:29

編集2018/07/12 09:28
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2018/07/12 09:03

最大公約数は互除法で求めてるからそこは変更の必要がないと思うのですが。
退会済みユーザー

退会済みユーザー

2018/07/12 09:20

私がやった方法だと新しく用意する変数は1つで済むのでこちらで書きました。 もちろん互除法のほうがループ回数は少なくて処理は速いですが、新しく3つの変数を準備しなければいけないのでどっちで書こうか迷いました。
swordone

2018/07/12 09:20

メソッドに切り出したい
退会済みユーザー

退会済みユーザー

2018/07/12 09:22

私も たった今 メソッドにしようと思いました。直しておきます。
退会済みユーザー

退会済みユーザー

2018/07/12 09:28

訂正しました。ご指摘ありがとうございます。
ssssa

2018/07/12 13:30

指摘やわかりやすいコードなどありがとうございます。 完成度が高く感動いたしました。 本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問