Phoenix_x

Untitled

Mar 10th, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.87 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <stack>
  4. #include <string>
  5.  
  6. using namespace std;
  7.  
  8. //Глобални променливи
  9. string number_1_string;
  10. string number_2_string;
  11. long number_1;
  12. long number_2;
  13.  
  14. int result; //разликата на двете числа
  15. int multiplyBy = 1; //единици, стотици, хиляди... 523 => 3 * 1 + 20 * 10 + 5 * 100
  16.  
  17. stack<int> number_1_stack;
  18. stack<int> number_2_stack;
  19.  
  20. int prenos = 0;
  21.  
  22. //Декларация на функции
  23. void fillStack(string number, stack<int> &number_stack);
  24.  
  25. void main()
  26. {
  27.     cout << "Num 1: ";
  28.     cin >> number_1;
  29.     number_1_string = to_string(number_1);
  30.     cout << "Num 2: ";
  31.     cin >> number_2;
  32.     number_2_string = to_string(number_2);
  33.  
  34.     fillStack(number_1_string, number_1_stack);
  35.     fillStack(number_2_string, number_2_stack);
  36.  
  37.     //запълване на двата стека с цифрите на двете числата
  38.  
  39.     int digit_1 = 0;
  40.     int digit_2 = 0;
  41.     int diffrence = 0; //разликата на две цифри
  42.  
  43.     //Кошмар
  44.     //докато и двата стека не са празни
  45.     while (!number_1_stack.empty() || !number_2_stack.empty())
  46.     {
  47.         if (number_1_stack.empty())
  48.         {
  49.             digit_1 = 0;
  50.         }
  51.         else
  52.         {
  53.             digit_1 = number_1_stack.top(); //взима последната цифра
  54.         }
  55.  
  56.         if (number_2_stack.empty())
  57.         {
  58.             digit_2 = 0;
  59.         }
  60.         else
  61.         {
  62.             digit_2 = number_2_stack.top(); //взима последната цифра
  63.         }
  64.  
  65.         if ((number_1 > 0 && number_2 < 0) || (number_1 < 0 && number_2 > 0)) { //123 + 456 или -123 -456
  66.             int sum = digit_1 + digit_2 + prenos;
  67.  
  68.             if (sum > 0) {
  69.                 prenos = 1;
  70.                 sum -= 10;
  71.             }
  72.             else {
  73.                 prenos = 0;
  74.             }
  75.  
  76.             result += sum * multiplyBy;
  77.         }
  78.  
  79.         else //-123 + 456 или 123-456
  80.         {
  81.             int diffrence = abs(digit_1 - digit_2) + prenos;
  82.  
  83.             if (digit_1 < digit_2)
  84.             {
  85.                 diffrence += 10;
  86.                 prenos = -1;
  87.             }
  88.             else {
  89.                 diffrence =  digit_2 + 10 - digit_1 + prenos;
  90.                 prenos = -1;
  91.             }
  92.  
  93.             result += diffrence * multiplyBy;
  94.         }
  95.  
  96.         if (!number_1_stack.empty()) {
  97.             number_1_stack.pop();
  98.         }
  99.  
  100.         if (!number_2_stack.empty()) {
  101.             number_2_stack.pop();
  102.         }
  103.  
  104.         multiplyBy *= 10;
  105.     }
  106.  
  107.     if (prenos == 1) //недовършена работа, Пример: 123 + 998
  108.     {
  109.         result += prenos * multiplyBy;
  110.     }
  111.  
  112.     if (prenos == -1) //-1124 + 1200
  113.     {
  114.         result += prenos * multiplyBy;
  115.     }
  116.  
  117.     if (number_1 < number_2) {
  118.         result *= -1;
  119.     }
  120.  
  121.     cout << "Substaction: " << result << endl;
  122. }
  123.  
  124. void fillStack(string number_string, stack<int> &number_stack)
  125. {
  126.     for (int i = 0; i < number_string.length(); i++) // за всеки символ (като всички са цифри с ASCII code)
  127.     {
  128.         if (number_string[i] != '-')
  129.         {
  130.             number_stack.push(number_string[i] - 48); //ASCII code: 2 има аски код '50', 50 - 48 = 2
  131.         }
  132.     }
  133. }
Advertisement
Add Comment
Please, Sign In to add comment