Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <conio.h>
- #include <string>
- #include <map>
- using namespace std;
- int main() {
- string Polynominal; //строка с введённым полиномом
- string DifferentiatedPolynominal = ""; //строка с дифференцированным полиномом
- string Tmp = ""; //временная строка, в которой храним части полинома
- char LastServiceSymbol; //последний из встретившихся символов +,-,*,^,x.
- int Multiplier, Power; //множитель и степень текущей части полинома
- map<int, int> DecomposedPolynominal = {}; //словарь, содержащий пары степень(ключ)/множитель(значение)
- cout << "Enter a polynominal\n";
- getline(cin, Polynominal);
- if (Polynominal[0] == '-')
- LastServiceSymbol = '-';
- else
- LastServiceSymbol = '+';
- DecomposedPolynominal.clear(); //очистка словаря в начале каждой итерации
- DifferentiatedPolynominal.clear(); //очистка строки
- for (int i = 0; i <= Polynominal.size(); i++) {
- //по последнему из встреченных символов +,-,*,^,x и текущему символу можно однозначно определить, какую часть полинома мы в данный момент проходим
- if (Polynominal[i] == '+' || Polynominal[i] == '-' || Polynominal[i] == '*' || Polynominal[i] == '^' || Polynominal[i] == 'x' || Polynominal[i] == '\0') {
- //множитель
- if ((LastServiceSymbol == '+' || LastServiceSymbol == '-') && Polynominal[i] == '*') {
- Multiplier = stoi(Tmp);
- if (LastServiceSymbol == '-')
- Multiplier *= -1;
- }
- //степень
- if (LastServiceSymbol == '^' && (Polynominal[i] == '+' || Polynominal[i] == '-' || Polynominal[i] == '\0')) {
- Power = stoi(Tmp);
- DecomposedPolynominal[Power] += Multiplier;
- }
- //единичный множитель перед x
- if ((LastServiceSymbol == '+' || LastServiceSymbol == '-') && Polynominal[i] == 'x') {
- if (LastServiceSymbol == '+')
- Multiplier = 1;
- else
- Multiplier = -1;
- }
- //x в первой степени
- if (LastServiceSymbol == 'x' && (Polynominal[i] == '+' || Polynominal[i] == '-' || Polynominal[i] == '\0')) {
- Power = 1;
- DecomposedPolynominal[Power] += Multiplier;
- }
- //свободный член
- if ((LastServiceSymbol == '+' || LastServiceSymbol == '-') && (Polynominal[i] == '+' || Polynominal[i] == '-' || Polynominal[i] == '\0') && i != 0){
- Power = 0;
- Multiplier = stoi(Tmp);
- DecomposedPolynominal[Power] += Multiplier;
- }
- LastServiceSymbol = Polynominal[i];
- Tmp = "";
- continue;
- }
- else
- if (Polynominal[i] < '0' || Polynominal[i] > '9') {
- cout << "ERROR: Incorrect symbols";
- break;
- }
- else
- Tmp += Polynominal[i];
- }
- //it -- обратный итератор. rbegin() -- возвращает end, нам нужна запись перед end (т.е. максимальная степень), значит ++.
- //first -- степень, second -- множитель
- bool AllZeros = true;
- for (auto it = DecomposedPolynominal.rbegin(); it != DecomposedPolynominal.rend(); )
- {
- it++;
- if (it.base()->first != 0 && it.base()->second != 0)
- AllZeros = false;
- if (DecomposedPolynominal.size() == 1 && (++DecomposedPolynominal.rbegin()).base()->first == 0) {
- DifferentiatedPolynominal = "0";
- break;
- }
- //если множитель равен нулю, то вывод для этого члена можно не производить
- if (it.base()->second != 0) {
- //если множитель не 0
- if (it.base()->first * it.base()->second != 0) {
- //знак не выводится для первого положительного члена
- if (!DifferentiatedPolynominal.empty() || it.base()->first * it.base()->second > 0)
- DifferentiatedPolynominal += '+';
- DifferentiatedPolynominal += to_string(it.base()->first * it.base()->second);
- }
- //выводим x, если степень не нулевая
- if (it.base()->first - 1 > 0)
- DifferentiatedPolynominal += "*x";
- //степень при x выводим, если она будет не равна единице или нулю
- if (it.base()->first - 1 > 1) {
- DifferentiatedPolynominal += '^' + to_string(it.base()->first - 1);
- }
- }
- }
- if (AllZeros)
- DifferentiatedPolynominal = "0";
- cout << DifferentiatedPolynominal << endl;
- getchar();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement