Умножение комплексных чисел
Даны две строки, которые представляют собой комплексное число.
Нужно вернуть строку, которая представляет собой результат умножения двух комплексных чисел. Примечание: 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.
Примечание:
- Во входных строках нет лишних пробелов.
- Входны строки даны в форме 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();
}
Комментарии
Отправить комментарий