1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
| class Factor
{
public int Enumerator { get { return _enum; } set { _enum = value; } }
public int Denumerator { get { return _denum; } set { _denum = value; } }
int _enum;
int _denum;
public Factor(int e, int d)
{
SetED(e, d);
}
public Factor(string fact)
{
var s = fact.Split('/');
SetED(int.Parse(s[0]), int.Parse(s[1]));
}
public Factor(double d)
{
int i = 0;
while (d % 1 != 0)
{
d *= 10;
i++;
}
SetED((int)d, (int)Math.Pow(10, i));
}
void SetED(int e, int d)
{
_enum = e;
if (d == 0) throw new DivideByZeroException();
_denum = d;
Optimize();
}
void Optimize()
{
if (_denum == 1) return;
else if (_enum % _denum == 0)
{
_enum /= _denum;
_denum = 1;
}
else if (isSimple(_enum)) return;
else
{
int min = Abs(_enum) > Abs(_denum) ? _denum : _enum;
for (int i = 2; i < min; i++)
if (isSimple(i))
if (_enum % i == 0 && _denum % i == 0)
{
_enum /= i;
_denum /= i;
Optimize();
}
}
}
bool isSimple(int val)
{
val = Abs(val);
for (int i = 2; i <= val / 2; i++)
if (val % i == 0) return false;
return true;
}
int Abs(int i)
{
if (i >= 0) return i;
else return -i;
}
public override string ToString()
{
return _denum != 1 ? String.Format("{0}/{1}",
Enumerator, _denum) : (Enumerator / _denum).ToString();
}
public static Factor operator +(Factor f1, Factor f2)
{
return new Factor(f1.Enumerator * f2._denum + f2.Enumerator * f1._denum,
f1._denum * f2._denum);
}
public static Factor operator -(Factor f1, Factor f2)
{
return new Factor(f1.Enumerator * f2._denum - f2.Enumerator * f1._denum,
f1._denum * f2._denum);
}
public static Factor operator *(Factor f1, Factor f2)
{
return new Factor(f1.Enumerator * f2.Enumerator, f1._denum * f2._denum);
}
public static Factor operator /(Factor f1, Factor f2)
{
return new Factor(f1.Enumerator * f2._denum, f1._denum * f2.Enumerator);
}
public static Factor operator +(Factor f1, int i)
{
return new Factor(f1.Enumerator + i * f1._denum, f1._denum);
}
public static Factor operator -(Factor f1, int i)
{
return new Factor(f1.Enumerator - i * f1._denum, f1._denum);
}
public static Factor operator *(Factor f1, int i)
{
return new Factor(f1.Enumerator * i, f1._denum);
}
public static Factor operator /(Factor f1, int i)
{
return new Factor(f1.Enumerator, f1._denum * i);
}
public static explicit operator double (Factor f)
{
return (double)f.Enumerator / (double)f.Denumerator;
}
public static explicit operator int(Factor f)
{
return (int)(double)f;
}
} |