Условие
Даны два комплексных числа. Найдите их сумму или разность.
Входные данные
В каждой строке задан пример на сложение или вычитание комплексных чисел. Комплексное число задается в формате $a+bi$ или $a-bi$, где $a$ целое, $b$ целое неотрицательное. Действительная и мнимая часть каждого комплексного числа по модулю не превышает $10^{9}$.
Выходные данные
Для каждого входного примера выведите ответ в отдельной строке.
Тесты
№ |
Входные данные |
Выходные данные |
1 |
2+3i + 7-4i
|
9-1i |
2 |
-1-1i — -1-1i
|
0+0i |
3 | 56743+876i — 1234-124i | 55509+1000i |
4 | 331+10i — 331+10i | 0+0i |
Код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#include <iostream> #include <string> using namespace std; struct complex_number { //создадим структуру комплексных чисел int real; int imagine; }; complex_number convert(string term) { complex_number x; x.real = 1; //чтобы не вводить отдельные переменные для знака присвоим начальное значение не 0, а 1 x.imagine = 1; if (term[0] == '-') { //если нулевой символ минус, то меняем значение действительной части на -1; x.real *= -1; term.erase(term.begin(), term.begin() + 1); //удаляем минус на нулевой позиции, если он есть, чтобы было легче найти второй знак } int index = term.find('+'); //находим индекс знака, если это плюс if (index == -1) { index = term.find('-'); //находим индекс знака, если это минус x.imagine = -1; //меняем значение мнимой части на -1, если второй знак минус } x.real *= atoi(&term.substr(0, index)[0]); //находим действительную часть x.imagine *= atoi(&term.substr(index + 1, term.size() - 2)[0]); //находим мнимую часть return x; //возвращаем полученное комплексное число } int main() { string term1, term2; char sign; complex_number convert_term1, convert_term2; while (cin >> term1 >> sign >> term2) { convert_term1 = convert(term1); //переводим первую строку в первое слагаемое convert_term2 = convert(term2); //переводим вторую строку во второе слагаемое if (sign == '+') { //выполняем действие соответствующее считанному знаку convert_term1.real += convert_term2.real; convert_term1.imagine += convert_term2.imagine; } else { convert_term1.real -= convert_term2.real; convert_term1.imagine -= convert_term2.imagine; } //если мнимая часть отрицательная, то минус между мнимой и действительной частями выведется сам, а если она положительная, то мы должны вывести плюс вручную cout << convert_term1.real << (convert_term1.imagine >= 0 ? "+" : "") << convert_term1.imagine << "i" << endl; } } |
Решение
Чтобы решить задачу создадим структуру комплексных чисел complex_number, для удобства работы с парой переменных одновременно, и функцию convert(), для того чтобы нам не пришлось повторять действия, описанные в функции, отдельно для каждого слагаемого. Внутри функции мы будем переводить строку в пару чисел то есть в структуру.
После перевода обеих введённых строк в структуру, останется только выполнить сложение или вычитание соответствующих элементов этих структур.