Умножение комплексных чисел

Даны две строки, которые представляют собой комплексное число.
Нужно вернуть строку, которая представляет собой результат умножения двух комплексных чисел. Примечание:  i2 = -1 - свойство комплесных чисел.
Пример 1:
Дано: "1+1i", "1+1i"
Результат: "0+2i"
Пояснение: (1 + i) * (1 + i) = 1 + i2 + 2 * i = 2i, и финальный результат: 0+2i.
Пример 2:
Дано: "1+-1i", "1+-1i"
Результат: "0+-2i"
Пояснение: (1 - i) * (1 - i) = 1 + i2 - 2 * i = -2i, и финальный результат: 0+-2i.
Примечание:
  1. Во входных строках нет лишних пробелов.
  2. Входны строки даны в форме a+bi, где целые a и b из интервала [-100, 100]. И результат должен быть отформатирован также.

Идея решения:
Просто умножим с раскрытием скобок и применением свойства квадрата мнимой части, полдучится: (a+bi)  * (c+di) = a*c + a*di + c*bi - b*d = (a*c - b*d) + (a*d + c*b)i

Поскольку вход  дон в виде сток, то нужно в строках выделить подстроки, представляющие рациональную и мнимую часть (с i), конфертировать их в численные значения, провести арифметические манипуляции и сформировать строковый результат.

При этом нам нужно учесть знаки рациональных и мнимых частей. Поскольку умножение чисел с разными знаками даст отрицательное число, а с одинаковыми - положительное.

Компилируемое решение:
public String complexNumberMultiply(String a, String b) {
    int aind = 0; // индекс символа сложения/вычитания в строке a
    int bind = 0; // индекс символа сложения/вычитания в строке b
    boolean aipos = true; // знак +- в строке a
    boolean bipos = true; // знак +- в строке b
    if (a.indexOf('+')>0) {
        aind = a.indexOf('+');
    } else if (a.indexOf('-')>=0) {
        aind = a.indexOf('-');
        aipos=false;
    }
    
    if (b.indexOf('+')>0) {
        bind = b.indexOf('+');
    } else if (b.indexOf('-')>=0) {
        bind = b.indexOf('-');
        bipos = false;
    }
    
// отделяем комплексную часть от некомплексной
    int iar = Integer.parseInt(a.substring(0, aind)); // некомплексная в a
    int ibr = Integer.parseInt(b.substring(0, bind)); // некомплексная в b
// тут комплексные части
    int iai = Integer.parseInt(a.substring(aind+1, a.length()-1));
    int ibi = Integer.parseInt(b.substring(bind+1, b.length()-1));
    
// умножаем некомплексную часть и добавляем в результат
    int sum = iar*ibr;
// умножаем комплексную и инвертируем, если знаки противоположные
    int z = iai*ibi; if (aipos^bipos) {z = -1*z;}
    sum -=z; // добавляем в результат к некомплексной части
// умножаем комплексные части с некомплексными - это комплексная часть в результате
    int x = iar*ibi; if (!bipos) { x = -1 * x;}
    int y = iai*ibr; if (!aipos) { y = -1 * y;}
    
// формируем результат в виде строки
    StringBuffer sb = new StringBuffer();
    sb.append(sum); // просто добавляем некомплексную часть
    if (x+y>=0) {
        sb.append('+');
    } else if (x+y<0) {
        sb.append("+-");
    }
    sb.append(Math.abs(x+y)).append("i");
    return sb.toString();
}

Комментарии

Популярные сообщения из этого блога

Разбиение числа на сумму с максимальным произведнием слагаемых

Число подмассивов, в которых сумма элементов равна k

Сложить два числа, которые представлены списком