import java.util.Scanner;
public class Frac {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
int b = scan.nextInt();
Frac f1 = new Frac(a, b); // ここで、コンストラクタを呼び、オブジェクトを生成する
// (参考)privateなメンバー変数なので、コンパイルエラーになる。
// f1.a = 1;
f1.yakubun();
System.out.println(f1.toString());
scan.close();
}
private int a, b;
Frac(int a, int b) { // コンストラクタ
setBunsi(a);
setBumbo(b);
}
public void setBunsi(int _a) {
a = _a;
this.checkSign();
}
public void setBumbo(int _b) {
if (_b == 0) {
// Javaで、実行時に「例外を発生させる」コード例は、以下です。
throw new RuntimeException("Bumbo is zero");
}
b = _b;
this.checkSign();
}
public void checkSign() {
/* 分子も分母も、マイナスだったら、符号を反転させてください */
if (a < 0 && b < 0) {
a = -a;
b = -b;
}
}
public String toString() {
return a + "/" + b;
}
public void yakubun() {
// ユークリッドの互除法を使って、最大公約数を求める
int ta = Math.abs(a);
int tb = Math.abs(b);
while (tb != 0) {
int r = ta % tb;
ta = tb;
tb = r;
}
// 最大公約数で割る
a /= ta;
b /= ta;
}
public Frac plus(Frac f) {
int newa = this.a * f.b + f.a * this.b;
int newb = this.b * f.b;
return new Frac(newa, newb);
}
public Frac minus(Frac f) {
/* ここを、返却値をふくめ、編集する */
return new Frac(1, 2);
}
public Frac 逆数(){
/* ここを、返却値をふくめ、編集する */
return new Frac(1, 2);
}
public Frac mul(Frac f) {
/* ここを、返却値をふくめ、編集する */
return new Frac(1, 2);
}
public Frac div(Frac f) {
/* ここを、返却値をふくめ、編集する
逆数() をうまく使うとシンプルに書けます。 */
return this.mul(f.逆数());
}
// 分数の数値としては等しいとき true(約分してなくてもよい。例:1/2 equals 2/4 )
public boolean equals(Frac f) {
return this.a * f.b == this.b * f.a;
}
// 分数の数値として等しく、かつ、分子分母の値もすべて等しいとき true
public boolean same(Frac f) {
return this.a == f.a && this.b == f.b;
}
}