Dziękuje za odpowiedzi.
Żeby jak najbardziej przybliżyć o co mi chodzi, to staram się stworzyć klasę ułamków Fraction, w której można używać liter, zmiennych albo dowolnie dużych liczb tzn.
Kopiuj
public class Fraction {
public List<FractionPair> numerator;
public List<FractionPair> denominator;
private static ListList<FractionPair> tmp_list = new ArrayList<FractionPair>();
public Fraction() {
numerator = new ArrayList<FractionPair>();
denominator = new ArrayList<FractionPair>();
}
private static void loop(List<FractionPair> L1, List<FractionPair> L2) {
tmp_list.clear();
for(FractionPair i : L1) {
for(FractionPair j : L2) {
tmp_list.add(i.mul(j));
}
}
}
public Fraction add(Fraction val) {
Fraction result = new Fraction();
loop(this.numerator, scnd.denominator);
result.numerator = new ArrayList<FractionPair>(tmp_list);
loop(scnd.numerator, this.denominator);
result.numerator.addAll(tmp_list);
loop(this.denominator, scnd.denominator);
result.denominator = new ArrayList<FractionPair>(tmp_list);
tmp_list.clear();
result.simplify();
return result;
}
private void simplify() {
TUTAJ POJAWIA SIĘ PROBLEM
}
}
class FractionPair {
public BigInteger number_num;
public String number_str;
public FractionPair() {
}
public FractionPair mul(FractionPair scnd) {
FractionPair result = new FractionPair();
result.number_num = this.number_num.multiply(scnd.number_num);
result.number_str = this.number_str.concat("*" + scnd.number_str);
return result;
}
}
Zatem na przykład dane są dwa obiekty typu Fraction:
Kopiuj
F1:
numerator: { (12, "z_1") , (5, "b") }
denominator: { (1, "c") , (-4, "d") }
F2:
numerator: { (10, "ZM_2") , (7, "G") }
denominator: { (1, "t") , (99, "A_2") }
F3 = F1.add(F2):
numerator: { (12,"z_1*t"),(1188,"z_1*A_2"),(5,"b*t"),(495,"b*A_2"),(10,"ZM_2*c"),(-40,"ZM_2*d"),(7,"G*c"),(-28,"G*d") }
denominator: { (1, "c*t") , (99, "c*A_2") , (-4, "d*t") , (-396, "d*A_2") }
Taki wynik otrzymuję obecnie, gdzie nawias oznacza element listy: (number_num, number_str)
Na tym przykładzie tego oczywiście nie wyjaśnię, ale dla bardziej złożonych operacji pojawiają się dokładnie te same wyrazy, o ewentualnie innych współczynnikach liczbowych i chodzi o to, aby za pomocą funkcji simplify() jak najbardziej "zwinąć" ułamek, czyli to co się da dodać to dodać co się da skrócić to skrócić itd. np:
Kopiuj
{ (10,"ZM_C*a*b") , (-8,"b*ZM_C*a") } --> { (2,"a*b*ZM_C") } lub { (2,"b*a*ZM_C") } lub { (2,"ZM_C*b*a") } itd. - kolejność wyrazów "zwiniętych" nie ma znaczenia
Mam nadzieję że jako tako wiadomo teraz o co mi chodziło.
PS.
Przepraszam ale w pierwszym poście zapomniałem dodać że ciągi wejściowe wyglądają tak jak podałem powyżej: "a*b*c*d_2" <-- litery, zmienne oddziela znak '*', aby sprawdzać gdzie zaczyna się lub kończy zmienna bądź litera.