Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "pch.h"
- #include <iostream>
- #include <string>
- #include <vector>
- using namespace std;
- char SprawdzZnak(string numbers); //zwraca znak arytmetyczny w string'u
- bool SprawdzZnak(char szukany, string numbers); //sprawdza czy znak znajduje sie w string'u
- string PodzielString(string* numbers, char znak); //Dzieli liczbę na 2 ciągi znaków
- string Dodawanie(string liczba1, string liczba2);
- string Odejmowanie(string liczba1, string liczba2);
- string Mnozenie(string liczba1, string liczba2);
- string Dzielenie(string liczba1, string liczba2);
- int Por(string liczba1, string liczba2);
- int main()
- {
- int d; // Liczba porównań
- cin >> d;
- cin.ignore();
- for (int i = 0; i < d; i++) //pobieranie t1 i t2 oraz obliczanie
- {
- string numbers;
- getline(cin, numbers);
- char znak;
- string liczba1, liczba2;
- znak = SprawdzZnak(numbers);
- liczba1 = PodzielString(&numbers, znak);
- liczba2 = PodzielString(&numbers, znak);
- if (znak == '+') cout << Dodawanie(liczba1, liczba2);
- else if (znak == '-') cout << Odejmowanie(liczba1, liczba2);
- else if (znak == '*') cout << Mnozenie(liczba1, liczba2);
- else if (znak == '/') cout << Dzielenie(liczba1, liczba2);
- cout << endl;
- }
- return 0;
- }
- char SprawdzZnak(string numbers) //zwraca znak arytmetyczny znajdujący się w ciągu
- {
- int znak;
- znak = SprawdzZnak('+', numbers);
- if (znak == 0) znak = SprawdzZnak('-', numbers);
- else return '+';
- if (znak == 0) znak = SprawdzZnak('*', numbers);
- else return '-';
- if (znak != 0) return '*';
- return '/';
- }
- bool SprawdzZnak(char szukany, string numbers) //sprawdza czy znak znajduję się w stringu
- {
- if (numbers.find(szukany) != string::npos) return 1;
- return 0;
- }
- string PodzielString(string* numbers, char znak) //dzieli numbers na 2 podstringi
- {
- size_t znakpos = numbers->find(znak);
- string str = numbers->substr(0, znakpos);
- numbers->erase(0, znakpos + 1);
- return str;
- }
- string Dodawanie(string liczba1, string liczba2)
- {
- if (liczba1.length() > liczba2.length()) swap(liczba1, liczba2); // Upewniam sie ze l2>l1
- string wynik = "";
- int l1 = liczba1.length(), l2 = liczba2.length();
- int roznica = l2 - l1;
- int carry = 0;
- for (int i = l1 - 1; i >= 0; i--)
- {
- // Obliczenia
- int suma = ((liczba1[i] - '0') + (liczba2[i + roznica] - '0') + carry);
- wynik.push_back(suma % 10 + '0');
- carry = suma / 10;
- }
- // Dodaj pozostałość l2
- for (int i = l2 - l1 - 1; i >= 0; i--)
- {
- int suma = ((liczba2[i] - '0') + carry);
- wynik.push_back(suma % 10 + '0');
- carry = suma / 10;
- }
- if (carry) wynik.push_back(carry + '0'); // Dodaj carry
- reverse(wynik.begin(), wynik.end()); // Odwracam wynik
- return wynik;
- }
- string Odejmowanie(string liczba1, string liczba2)
- {
- bool neg=0;
- if (liczba1.length() < liczba2.length())
- {
- swap(liczba2, liczba1);
- neg = 1;
- }
- if (liczba1.length() == liczba2.length())
- {
- for (int j = 0; j < liczba1.length(); j++)
- {
- if (liczba1[j] < liczba2[j])
- {
- swap(liczba2, liczba1);
- neg = 1;
- break;
- }
- else if (liczba1[j] > liczba2[j]) break;
- }
- }
- string wynik = "";
- int l1 = liczba1.length(), l2 = liczba2.length();
- int roznica = l1 - l2;
- int carry = 0;
- for (int i = l2 - 1; i >= 0; i--)
- {
- // Obliczenia
- int odejmowanie = ((liczba1[i + roznica] - '0') - (liczba2[i] - '0') - carry);
- if (odejmowanie < 0)
- {
- odejmowanie = odejmowanie + 10;
- carry = 1;
- }
- else
- carry = 0;
- wynik.push_back(odejmowanie + '0');
- }
- // Odejmij pozostałe liczby w liczba1
- if (roznica != 0)
- {
- for (int i = l1 - l2 - 1; i >= 0; i--)
- {
- if (liczba1[i] == '0' && carry)
- {
- wynik.push_back('9');
- continue;
- }
- int odejmowanie = ((liczba1[i] - '0') - carry);
- if (i > 0 || odejmowanie > 0) wynik.push_back(odejmowanie + '0');// Usuń zera
- carry = 0;
- }
- }
- reverse(wynik.begin(), wynik.end());
- // Usuń zera z przodu
- while (wynik[0] == '0')
- {
- wynik.erase(wynik.begin());
- }
- if (neg == 1) wynik.insert(0, "-");
- return wynik;
- }
- string Mnozenie(string liczba1, string liczba2)
- {
- int l1 = liczba1.size();
- int l2 = liczba2.size();
- if (l1 == 0 || l2 == 0)
- return "0";
- // Odwrócony wynik w wektorze
- vector<int> wynik(l1 + l2, 0);
- // Pozycja
- int i_l1 = 0;
- int i_l2 = 0;
- for (int i = l1 - 1; i >= 0; i--)
- {
- int carry = 0;
- int l1 = liczba1[i] - '0';
- i_l2 = 0; // Resetowanie pozycji
- for (int j = l2 - 1; j >= 0; j--)
- {
- int l2 = liczba2[j] - '0';
- int sum = l1 * l2 + wynik[i_l1 + i_l2] + carry;
- carry = sum / 10;
- wynik[i_l1 + i_l2] = sum % 10;
- i_l2++;
- }
- if (carry > 0) wynik[i_l1 + i_l2] += carry;
- i_l1++;
- }
- // Pozbądź się zer z prawej
- int i = wynik.size() - 1;
- while (i >= 0 && wynik[i] == 0) i--;
- if (i == -1) return "0";
- string w = ""; // Wynik
- while (i >= 0) w += to_string(wynik[i--]);
- return w;
- }
- string Dzielenie(string liczba1, string liczba2)
- {
- if (liczba2 == "0") return 0; // Dzielenie przez 0
- int por = Por(liczba1, liczba2);
- if (liczba1 == "0" || por == -1) return "0";
- if (por == 0) return "1";
- string wynik = "0";
- while (Por(liczba1, liczba2) >= 0)
- {
- if (liczba1.length() - liczba2.length() == 0)
- {
- liczba1 = Odejmowanie(liczba1, liczba2);
- wynik = Dodawanie(wynik, "1");
- }
- else
- {
- string Przesuniecie = liczba2;
- while (liczba1.length() > liczba2.length()) Przesuniecie += '0';
- if (Por(liczba1, Przesuniecie) == -1) Przesuniecie.pop_back();
- liczba1 = Odejmowanie(liczba1, Przesuniecie);
- string Dziesietne = "1";
- for (int a = 0; a < Przesuniecie.length() - liczba2.length(); a++) Dziesietne += "0";
- //wynik = Dodawanie(wynik, dec);
- }
- }
- return wynik;
- }
- int Por(string liczba1, string liczba2)
- {
- if (liczba1.length() < liczba2.length()) return -1;
- else if (liczba1.length() > liczba2.length()) return 1;
- for (int i = 0; i < liczba1.length(); i++)
- {
- if (liczba1[i] < liczba2[i]) return -1;
- else if (liczba1[i] == liczba2[i]);
- else return 1;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement