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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

5721閲覧

C#での分数の計算について

4CDAxx

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/12/22 05:36

初めまして。Unity、C#を勉強中の初心者です。
こちらのサイトのチャレンジ問題prob8-6.について質問させていただきたいと思います。

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 ← 整数になるケース

自分なりにコードを作成し(後述)デバッグを行ってみたところ、上記設問で求められている計算結果が問題なく表示できているようなのでホッと一安心…なのですが、さらに見やすくわかりやすいコードにするにはどうすればいいのかわからず悩んでおります。
改良点・改善点等ございましたら教えていただければ幸いです。

該当のソースコード

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6 7namespace Problem8_6 8{ 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 Random rand = new Random(); 14 int denominator1 = rand.Next(2, 11); // 分母1 15 int numerator1 = rand.Next(1, 11); // 分子1 16 int denominator2 = rand.Next(2, 11); // 分母2 17 int numerator2 = rand.Next(1, 11); // 分子2 18 int n = 0; // 整数部分をnとする 19 Console.Write("{0}/{1} + {2}/{3} = ", numerator1, denominator1, numerator2, denominator2); 20 21 int resultDenominator = denominator1 * denominator2; 22 int resultNumerator = numerator1 * denominator2 + numerator2 * denominator1; 23 24 int m = Gcd(resultDenominator, resultNumerator); 25 resultDenominator /= m; 26 resultNumerator /= m; 27 28 while (resultNumerator >= resultDenominator) 29 { 30 resultNumerator -= resultDenominator; 31 n++; 32 } 33 if (resultNumerator % resultDenominator == 0 && n != 0) 34 { 35 Console.WriteLine("{0}", n); 36 } 37 else if (n != 0) 38 { 39 Console.WriteLine("{0}.{1}/{2}", n, resultNumerator, resultDenominator); 40 } 41 else 42 { 43 Console.WriteLine("{0}/{1}", resultNumerator, resultDenominator); 44 } 45 } 46 static int Gcd(int a, int b) // 最大公約数を求める 47 { 48 int x; 49 while ((x = a % b) != 0) 50 { 51 a = b; 52 b = x; 53 } 54 return b; 55 } 56 } 57}

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

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

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

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

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

guest

回答2

0

ベストアンサー

while (resultNumerator >= resultDenominator)
{
resultNumerator -= resultDenominator;
n++;
}

商と余りで書いた方が素直である(=わかりやすい)ように思います.

n = resultNumerator / resultDenominator; resultNumerator = resultNumerator % resultDenominator;

直後のif

if (resultNumerator % resultDenominator == 0 && n != 0)

は,
if( resultNumerator==0 )で.

投稿2020/12/22 06:30

編集2020/12/22 06:33
fana

総合スコア11996

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

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

4CDAxx

2020/12/23 01:05

回答いただきましてありがとうございます。 ご指摘いただいた内容を基にコードを組みなおすことができました。
guest

0

######修正前

C#

1 int n = 0; // 整数部分をnとする 2 3 while (resultNumerator >= resultDenominator) 4 { 5 resultNumerator -= resultDenominator; 6 n++; 7 } 8 if (resultNumerator % resultDenominator == 0 && n != 0) 9 { 10 Console.WriteLine("{0}", n); 11 } 12 else if (n != 0) 13 { 14 Console.WriteLine("{0}.{1}/{2}", n, resultNumerator, resultDenominator); 15 } 16 else 17 { 18 Console.WriteLine("{0}/{1}", resultNumerator, resultDenominator); 19 }

######修正後

C#

1 // int n = 0;を消去 2 // whileループを使わずif文で動作するよう条件式を変更 3 4 if (resultNumerator % resultDenominator == 0) 5 { 6 Console.WriteLine("{0}", resultDenominator / resultDenominator); 7 } 8 else if (resultNumerator > resultDenominator) 9 { 10 Console.WriteLine("{0}.{1}/{2}", resultNumerator / resultDenominator, resultNumerator % resultDenominator, resultDenominator); 11 } 12 else 13 { 14 Console.WriteLine("{0}/{1}", resultNumerator, resultDenominator); 15 } 16

投稿2020/12/23 01:26

4CDAxx

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問