Advertisement
Guest User

B v2.0

a guest
Jan 17th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.05 KB | None | 0 0
  1. #include "pch.h"
  2. #include <iostream>
  3. #include <string>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. char SprawdzZnak(string numbers); //zwraca znak arytmetyczny w string'u
  9.  
  10. bool SprawdzZnak(char szukany, string numbers); //sprawdza czy znak znajduje sie w string'u
  11.  
  12. string PodzielString(string* numbers, char znak);  //Dzieli liczbę na 2 ciągi znaków
  13.  
  14. string Dodawanie(string liczba1, string liczba2);
  15.  
  16. string Odejmowanie(string liczba1, string liczba2);
  17.  
  18. string Mnozenie(string liczba1, string liczba2);
  19.  
  20. string Dzielenie(string liczba1, string liczba2);
  21.  
  22. int Por(string liczba1, string liczba2);
  23.  
  24. int main()
  25. {
  26.     int d; // Liczba porównań
  27.     cin >> d;
  28.     cin.ignore();
  29.  
  30.     for (int i = 0; i < d; i++) //pobieranie t1 i t2 oraz obliczanie
  31.     {
  32.         string numbers;
  33.  
  34.         getline(cin, numbers);
  35.         char znak;
  36.         string liczba1, liczba2;
  37.  
  38.         znak = SprawdzZnak(numbers);
  39.         liczba1 = PodzielString(&numbers, znak);
  40.         liczba2 = PodzielString(&numbers, znak);
  41.         if (znak == '+') cout << Dodawanie(liczba1, liczba2);
  42.         else if (znak == '-') cout << Odejmowanie(liczba1, liczba2);
  43.         else if (znak == '*') cout << Mnozenie(liczba1, liczba2);
  44.         else if (znak == '/') cout << Dzielenie(liczba1, liczba2);
  45.         cout << endl;
  46.     }
  47.  
  48.     return 0;
  49. }
  50.  
  51. char SprawdzZnak(string numbers) //zwraca znak arytmetyczny znajdujący się w ciągu
  52. {
  53.     int znak;
  54.  
  55.     znak = SprawdzZnak('+', numbers);
  56.     if (znak == 0) znak = SprawdzZnak('-', numbers);
  57.     else return '+';
  58.     if (znak == 0) znak = SprawdzZnak('*', numbers);
  59.     else return '-';
  60.     if (znak != 0) return '*';
  61.     return '/';
  62. }
  63.  
  64. bool SprawdzZnak(char szukany, string numbers) //sprawdza czy znak znajduję się w stringu
  65. {
  66.     if (numbers.find(szukany) != string::npos)  return 1;
  67.     return 0;
  68. }
  69.  
  70. string PodzielString(string* numbers, char znak)    //dzieli numbers na 2 podstringi
  71. {
  72.     size_t znakpos = numbers->find(znak);
  73.     string str = numbers->substr(0, znakpos);
  74.     numbers->erase(0, znakpos + 1);
  75.     return str;
  76. }
  77.  
  78. string Dodawanie(string liczba1, string liczba2)
  79. {
  80.     if (liczba1.length() > liczba2.length()) swap(liczba1, liczba2); // Upewniam sie ze l2>l1
  81.    
  82.     string wynik = "";
  83.     int l1 = liczba1.length(), l2 = liczba2.length();
  84.     int roznica = l2 - l1;
  85.     int carry = 0;
  86.  
  87.     for (int i = l1 - 1; i >= 0; i--)
  88.     {
  89.         // Obliczenia
  90.         int suma = ((liczba1[i] - '0') + (liczba2[i + roznica] - '0') + carry);
  91.         wynik.push_back(suma % 10 + '0');
  92.         carry = suma / 10;
  93.     }
  94.  
  95.     // Dodaj pozostałość l2
  96.     for (int i = l2 - l1 - 1; i >= 0; i--)
  97.     {
  98.         int suma = ((liczba2[i] - '0') + carry);
  99.         wynik.push_back(suma % 10 + '0');
  100.         carry = suma / 10;
  101.     }
  102.  
  103.     if (carry) wynik.push_back(carry + '0');    // Dodaj carry
  104.  
  105.     reverse(wynik.begin(), wynik.end());    // Odwracam wynik
  106.  
  107.     return wynik;
  108. }
  109.  
  110. string Odejmowanie(string liczba1, string liczba2)
  111. {
  112.     bool neg=0;
  113.     if (liczba1.length() < liczba2.length())
  114.     {
  115.         swap(liczba2, liczba1);
  116.         neg = 1;
  117.     }
  118.     if (liczba1.length() == liczba2.length())
  119.     {
  120.         for (int j = 0; j < liczba1.length(); j++)
  121.         {
  122.             if (liczba1[j] < liczba2[j])
  123.             {
  124.                 swap(liczba2, liczba1);
  125.                 neg = 1;
  126.                 break;
  127.             }
  128.             else if (liczba1[j] > liczba2[j]) break;
  129.         }
  130.     }
  131.  
  132.     string wynik = "";
  133.     int l1 = liczba1.length(), l2 = liczba2.length();
  134.     int roznica = l1 - l2;
  135.     int carry = 0;
  136.  
  137.     for (int i = l2 - 1; i >= 0; i--)
  138.     {
  139.         // Obliczenia
  140.         int odejmowanie = ((liczba1[i + roznica] - '0') - (liczba2[i] - '0') - carry);
  141.         if (odejmowanie < 0)
  142.         {
  143.             odejmowanie = odejmowanie + 10;
  144.             carry = 1;
  145.         }
  146.         else
  147.             carry = 0;
  148.  
  149.         wynik.push_back(odejmowanie + '0');
  150.     }
  151.  
  152.     // Odejmij pozostałe liczby w liczba1
  153.     if (roznica != 0)
  154.     {
  155.         for (int i = l1 - l2 - 1; i >= 0; i--)
  156.         {
  157.             if (liczba1[i] == '0' && carry)
  158.             {
  159.                 wynik.push_back('9');
  160.                 continue;
  161.             }
  162.             int odejmowanie = ((liczba1[i] - '0') - carry);
  163.             if (i > 0 || odejmowanie > 0) wynik.push_back(odejmowanie + '0');// Usuń zera
  164.  
  165.             carry = 0;
  166.  
  167.         }
  168.     }
  169.     reverse(wynik.begin(), wynik.end());
  170.     // Usuń zera z przodu
  171.     while (wynik[0] == '0')
  172.     {
  173.         wynik.erase(wynik.begin());
  174.     }
  175.     if (neg == 1) wynik.insert(0, "-");
  176.     return wynik;
  177. }
  178.  
  179. string Mnozenie(string liczba1, string liczba2)
  180. {
  181.     int l1 = liczba1.size();
  182.     int l2 = liczba2.size();
  183.     if (l1 == 0 || l2 == 0)
  184.         return "0";
  185.  
  186.     // Odwrócony wynik w wektorze
  187.     vector<int> wynik(l1 + l2, 0);
  188.  
  189.     // Pozycja
  190.     int i_l1 = 0;
  191.     int i_l2 = 0;
  192.  
  193.     for (int i = l1 - 1; i >= 0; i--)
  194.     {
  195.         int carry = 0;
  196.         int l1 = liczba1[i] - '0';
  197.  
  198.        
  199.         i_l2 = 0;   // Resetowanie pozycji
  200.          
  201.         for (int j = l2 - 1; j >= 0; j--)
  202.         {
  203.             int l2 = liczba2[j] - '0';
  204.             int sum = l1 * l2 + wynik[i_l1 + i_l2] + carry;
  205.             carry = sum / 10;
  206.             wynik[i_l1 + i_l2] = sum % 10;
  207.  
  208.             i_l2++;
  209.         }
  210.  
  211.         if (carry > 0)  wynik[i_l1 + i_l2] += carry;
  212.         i_l1++;
  213.     }
  214.  
  215.     // Pozbądź się zer z prawej
  216.     int i = wynik.size() - 1;
  217.     while (i >= 0 && wynik[i] == 0) i--;
  218.     if (i == -1) return "0";
  219.  
  220.     string w = "";  // Wynik
  221.     while (i >= 0) w += to_string(wynik[i--]);
  222.  
  223.     return w;
  224. }
  225.  
  226. string Dzielenie(string liczba1, string liczba2)
  227. {
  228.     if (liczba2 == "0") return 0; // Dzielenie przez 0
  229.     int por = Por(liczba1, liczba2);
  230.     if (liczba1 == "0" || por == -1) return "0";
  231.     if (por == 0) return "1";
  232.  
  233.     string wynik = "0";
  234.  
  235.     while (Por(liczba1, liczba2) >= 0)
  236.     {
  237.         if (liczba1.length() - liczba2.length() == 0)
  238.         {
  239.             liczba1 = Odejmowanie(liczba1, liczba2);
  240.             wynik = Dodawanie(wynik, "1");
  241.         }
  242.         else
  243.         {
  244.             string Przesuniecie = liczba2;
  245.             while (liczba1.length() > liczba2.length()) Przesuniecie += '0';
  246.             if (Por(liczba1, Przesuniecie) == -1) Przesuniecie.pop_back();
  247.             liczba1 = Odejmowanie(liczba1, Przesuniecie);
  248.             string Dziesietne = "1";
  249.             for (int a = 0; a < Przesuniecie.length() - liczba2.length(); a++) Dziesietne += "0";
  250.             //wynik = Dodawanie(wynik, dec);
  251.         }
  252.     }
  253.     return wynik;
  254. }
  255.  
  256. int Por(string liczba1, string liczba2)
  257. {
  258.     if (liczba1.length() < liczba2.length()) return -1;
  259.     else if (liczba1.length() > liczba2.length()) return 1;
  260.     for (int i = 0; i < liczba1.length(); i++)
  261.     {
  262.         if (liczba1[i] < liczba2[i]) return -1;
  263.         else if (liczba1[i] == liczba2[i]);
  264.         else return 1;
  265.     }
  266.     return 0;
  267. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement