javaで(((1□9)△1)○9)==10となるような加減乗除の組み合わせを探すプログラムを考えています。
(□,△,○)はそれぞれ+,-,*,/のいずれかです。
まず分数を表すクラスFractionを作りました。
public class Fraction{
private int nume, deno;//numeが分子,denoが分母
//初期化
public Fraction() {
nume = 0;
deno = 1;
}
//整数の場合
public Fraction(int n){
nume = n;
deno = 1;
}
//整数でない場合
public Fraction(int n, int d){
nume = n;
deno = d;
}
//最大公約数を求める
static int gcd(int nume, int deno){
if(deno == 0){
return nume;
}
else
return gcd(deno, nume % deno);
}
//分数の足し算
public static Fraction add(Fraction v1, Fraction v2) {
Fraction w = new Fraction();
w.nume = v1.nume*v2.deno+v2.nume*v1.deno;
w.deno = v1.deno*v2.deno;
//約分
int gcd = gcd(w.nume, w.deno);
w.nume = w.nume / gcd;
w.deno = w.deno / gcd;
return w;
}
//分数の引き算
public static Fraction sub(Fraction v1, Fraction v2) {
Fraction w = new Fraction();
w.nume = v1.nume*v2.deno-v2.nume*v1.deno;
w.deno = v1.deno*v2.deno;
int gcd = gcd(w.nume, w.deno);
w.nume = w.nume / gcd;
w.deno = w.deno / gcd;
return w;
}
//分数の掛け算
public static Fraction mult(Fraction v1, Fraction v2) {
Fraction w = new Fraction();
w.nume = v1.nume*v2.nume;
w.deno = v1.deno*v2.deno;
int gcd = gcd(w.nume, w.deno);
w.nume = w.nume / gcd;
w.deno = w.deno / gcd;
return w;
}
//分数の割り算
public static Fraction div(Fraction v1, Fraction v2) {
Fraction w = new Fraction();
w.nume = v1.nume*v2.deno;
w.deno = v1.deno*v2.nume;
int gcd = gcd(w.nume, w.deno);
w.nume = w.nume / gcd;
w.deno = w.deno / gcd;
return w;
}
//分子を呼び出す
int getNume() {
return nume;
}
//分母を呼び出す
int getDeno() {
return deno;
}
}
ここからが今困っていることなのですが、条件に合うような加減乗除を探すプログラムが作れず行き詰っています。
一応少し作ったのが次のクラスTestです(不完全です)。
public class Test {
public static void main(String[]args){
Fraction v0 = new Fraction(1);
Fraction v1 = new Fraction(9);
Fraction v2 = new Fraction(1);
Fraction v3 = new Fraction(9);
//0=[+],1=[-],2=[*],3=[/]
for (int i = 0; i < 4; i++) {
switch(i) {
case 0:
v0 = Fraction.add(v0,v1);
break;
case 1:
v0 = Fraction.sub(v0,v1);
break;
case 2:
v0 = Fraction.mult(v0,v1);
break;
case 3:
v0 = Fraction.div(v0,v1);
break;
}
}
}
}
↑の調子で作っていくとどうしても4^3=64通りすべて書くことになり面倒です。上手くループを使えないでしょうか?
どなたか教えてください。
お礼
ご回答ありがとうございました。