概ねこんな感じかと
csharp
1
2 using System ;
3
4 namespace ConsoleApp1
5 {
6 //分数を表現する構造体
7 struct Fraction
8 {
9 public Fraction ( int numerator , int denominator )
10 : this ( )
11 {
12 Numerator = numerator ;
13 Denominator = denominator ;
14 }
15 public int Numerator { get ; }
16 public int Denominator { get ; }
17 }
18
19 class Program
20 {
21 //約分するときに使う素数(尚、数えてもあんまり意味は無い)
22 private static int [ ] PrimeNumbers = { 5 , 3 , 2 } ;
23
24 static void Main ( )
25 {
26 //乱数
27 Random rnd = new Random ( 42 ) ;
28
29 //とりあえず10回
30 for ( int i = 0 ; i < 10 ; i ++ )
31 {
32 var x = new Fraction ( rnd . Next ( 2 , 11 ) , rnd . Next ( 2 , 11 ) ) ;
33 var y = new Fraction ( rnd . Next ( 2 , 11 ) , rnd . Next ( 2 , 11 ) ) ;
34
35 var result = Add ( x , y ) ;
36 Console . WriteLine ( $" { x . Numerator } / { x . Denominator } + { y . Numerator } / { y . Denominator } = { Display ( result ) } " ) ;
37 }
38
39
40 }
41
42
43 //加算処理
44 static Fraction Add ( Fraction x , Fraction y )
45 {
46 var denominator = x . Denominator * y . Denominator ;
47 var numerator = x . Numerator * y . Denominator + x . Denominator * y . Numerator ;
48
49 return Reduction ( new Fraction ( numerator , denominator ) ) ;
50 }
51
52 //約分
53 static Fraction Reduction ( Fraction fraction )
54 {
55
56 int numerator = fraction . Numerator ;
57 int denominator = fraction . Denominator ;
58
59
60 foreach ( var p in PrimeNumbers )
61 {
62 if ( numerator % p == 0 && denominator % p == 0 )
63 {
64 numerator /= p ;
65 denominator /= p ;
66 }
67 }
68
69 return new Fraction ( numerator , denominator ) ;
70 }
71
72 //通分して文字列に
73 static string Display ( Fraction fraction )
74 {
75 var f = Reduction ( fraction ) ;
76 int tmp = f . Numerator / f . Denominator ;
77
78 //整数だった場合
79 if ( fraction . Numerator % fraction . Denominator == 0 )
80 {
81 return tmp . ToString ( ) ;
82 }
83
84 //帯分数だった場合
85 if ( tmp >= 1 )
86 {
87 return $" { tmp } . { fraction . Numerator % fraction . Denominator } / { fraction . Denominator } " ;
88 }
89
90 return $" { f . Numerator } / { f . Denominator } " ;
91 }
92
93 }
94 }
95
96
97
こっから先はお戯れなので、まぁこーいう風にも書けるのかー程度に
csharp
1
2
3 using System ;
4 using System . Linq ;
5
6 namespace ConsoleApp1
7 {
8 //値型にしなよ~と言う意見は重々承知してるけど、0/0を避けたかったの。
9 //けどNullに成る病にかかった模様
10 class Fraction
11 {
12
13 private static readonly int [ ] PrimeNumbers = { 5 , 3 , 2 } ;
14
15 //尚、範囲チェックはしてない模様(故、0以下の数が来ると宇宙の法則が乱れる)
16 public Fraction ( int numerator , int denominator )
17 {
18 Numerator = numerator ;
19 Denominator = denominator ;
20 }
21
22 //イマドキなら逆にreadonly付けてpublicフィールドでも良いかもね?
23 public int Numerator { get ; }
24 public int Denominator { get ; }
25
26 //演算子のオーバーロードして、ホントに分数同士を足せるようにした
27 //Nullは来ない。良いね?
28 public static Fraction operator + ( Fraction x , Fraction y )
29 {
30 var denominator = x . Denominator * y . Denominator ;
31 var numerator = x . Numerator * y . Denominator + x . Denominator * y . Numerator ;
32
33 return new Fraction ( numerator , denominator ) ;
34 }
35
36 //約分した分数を返す
37 //まぁImmutableにしたかった
38 //ついでに言うなら提示された範囲の中でしか約分できない
39 public Fraction Reduction ( )
40 {
41 var d = Denominator ;
42 var n = Numerator ;
43
44 //アライさん無理にLINQ使うのはやめなよ
45 foreach ( var p in PrimeNumbers )
46 {
47 if ( d % p == 0 && n % p == 0 )
48 {
49 d /= p ;
50 n /= p ;
51 }
52 }
53
54 return new Fraction ( n , d ) ;
55 }
56
57
58 //異論は有るでしょーがまぁ仕様にあわせた
59 public override string ToString ( )
60 {
61 var tmp = Reduction ( ) ;
62
63 var integer = tmp . Numerator / tmp . Denominator ;
64
65 if ( tmp . Numerator % tmp . Denominator == 0 ) return integer . ToString ( ) ;
66
67 if ( integer >= 1 )
68 {
69 return $" { integer } . { tmp . Numerator % tmp . Denominator } / { tmp . Denominator } " ;
70 }
71
72 return $" { tmp . Numerator } / { tmp . Denominator } " ;
73 }
74 }
75
76 class Program
77 {
78 static void Main ( )
79 {
80 //乱数
81 Random rnd = new Random ( 42 ) ;
82
83 //とはいえやっぱりLINQはどこかで使いたいw
84 var hoge = from _ in Enumerable . Range ( 0 , 10 )
85 let x = new Fraction ( rnd . Next ( 2 , 11 ) , rnd . Next ( 2 , 11 ) )
86 let y = new Fraction ( rnd . Next ( 2 , 11 ) , rnd . Next ( 2 , 11 ) )
87 //ココで+を使いたかった。
88 let result = x + y
89 select result . ToString ( ) ;
90
91 foreach ( var s in hoge )
92 {
93 Console . WriteLine ( s ) ;
94 }
95 }
96
97
98 }
99 }
100
101
102
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/09 11:36