Advertisement
193030

2019. A. calc, base number systems

Apr 17th, 2020
328
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.27 KB | None | 0 0
  1. // C program to convert a number from any base
  2. // to decimal
  3. #include <iostream>
  4. #include <stdio.h>
  5. #include <string>
  6. #include <string.h>
  7. #include <cstdlib>
  8. #include <cstring>
  9. #include <sstream>      // std::stringstream
  10. #include <vector>
  11. #include <algorithm>
  12. using namespace std;
  13.  
  14. int state = 0;
  15. int signPosition =0;
  16. int equalSignPosition = 1;
  17.  
  18. #define ADDITION 1
  19. #define MULTIPLICATION 2
  20.  
  21. vector <int> outputV; // Vector for the output
  22. long sstoi(const char *s) // custom stoi function
  23. {
  24.     long i;
  25.     i = 0;
  26.     while(*s >= '0' && *s <= '9')
  27.     {
  28.         i = i * 10 + (*s - '0');
  29.         s++;
  30.     }
  31.     return i;
  32. }
  33.  
  34.  
  35. int getFirstNumber(string input, int signPos)
  36. {
  37.     string newString = input.substr(0,signPos);
  38.     int firstNum = sstoi(newString.c_str());
  39.     return firstNum;
  40.    // cout << "Return first num: " << firstNum << endl;
  41. }
  42.  
  43. int getSecondNumber(string input, int signPos)
  44. {
  45.     string newString = input.substr(signPos+1, equalSignPosition-signPosition-1);
  46.     int secondNum = sstoi(newString.c_str());
  47.     return secondNum;
  48. }
  49.  
  50. int getThirdNumber(string input, int equalSignPos)
  51. {
  52.     string newString = input.substr(equalSignPos+1);
  53.     int thirdNumber = sstoi(newString.c_str());
  54.     return thirdNumber;
  55. }
  56.  
  57. int val(char c)
  58. {
  59.     if (c >= '0' && c <= '9')
  60.         return (int)c - '0';
  61.     else
  62.         return (int)c - 'A' + 10;
  63. }
  64.  
  65. // Function to convert a number from given base 'b'
  66. // to decimal
  67. int toDeci(char *str, int base)
  68. {
  69.     int len = strlen(str);
  70.     int power = 1; // Initialize power of base
  71.     int num = 0; // Initialize result
  72.     int i;
  73.  
  74.     // Decimal equivalent is str[len-1]*1 +
  75.     // str[len-1]*base + str[len-1]*(base^2) + ...
  76.     for (i = len - 1; i >= 0; i--)
  77.     {
  78.         // A digit in input number must be
  79.         // less than number's base
  80.         if (val(str[i]) >= base)
  81.         {
  82.         //printf("Invalid Number");
  83.         return -1;
  84.         }
  85.  
  86.         num += val(str[i]) * power;
  87.         power = power * base;
  88.     }
  89.  
  90.     return num;
  91. }
  92.  
  93. // Driver code
  94. int main()
  95. {
  96.  
  97.     /*
  98.     char str[] = "21";
  99.     int base = 3;
  100.     printf("Decimal equivalent of %s in base %d is "
  101.         " %d\n", str, base, toDeci(str, base));
  102.     return 0;
  103.     */
  104.     int broiTestove = 0;
  105.     cin >> broiTestove;
  106.     cin.ignore();
  107.     string input;
  108.     while(getline(cin, input)){
  109.    // cin.ignore();
  110.     if(input.empty())
  111.         break;
  112.  
  113.     equalSignPosition = input.find('=');
  114.     if(input.find('+')!=-1)
  115.     {
  116.        state = ADDITION;
  117.         signPosition = input.find('+');
  118.     }
  119.  
  120.     if(input.find('*')!=-1)
  121.     {
  122.         state = MULTIPLICATION;
  123.         signPosition = input.find('*');
  124.      //   cout << "sign * " << endl;
  125.     }
  126.  
  127.  
  128.     int firstNum = getFirstNumber(input, signPosition);
  129.     int secondNum = getSecondNumber(input,++signPosition);
  130.     int thirdNum = getThirdNumber(input,++equalSignPosition);
  131.  
  132.    // cout << "First number: " << firstNum << " second number: " << secondNum << " third number " << thirdNum << endl;
  133.  
  134.     //Converting the numbers above from int type to char arrays, bcs toDeci() works with char arrays
  135.     string firstNumString;
  136.     string secondNumString;
  137.     string thirdNumString;
  138.     firstNumString = to_string(firstNum);
  139.     secondNumString =  to_string(secondNum);
  140.     thirdNumString =  to_string(thirdNum);
  141.     char inputCharArrayFirstNumber[firstNumString.size() + 1];
  142.     strcpy(inputCharArrayFirstNumber, firstNumString.c_str());  // or pass &s[0]
  143.     char inputCharArraySecondNumber[secondNumString.size() + 1];
  144.     strcpy(inputCharArraySecondNumber, secondNumString.c_str());    // or pass &s[0]
  145.     char inputCharArrayThirdNumber[thirdNumString.size() + 1];
  146.     strcpy(inputCharArrayThirdNumber, thirdNumString.c_str());  // or pass &s[0]
  147.  
  148.     //cout << "predi fora" << endl;
  149.  
  150.     for(int i =2; i<=10; i++)
  151.     {
  152.        // cout << endl;
  153.         //cout << " for index: " << i << " ";
  154.         int firstConvertedNumber = toDeci(inputCharArrayFirstNumber, i);
  155.        // cout << "first converted number " << firstConvertedNumber << " ";
  156.         int secondConvertedNumber = toDeci(inputCharArraySecondNumber, i);
  157.        // cout << "second converted number " << secondConvertedNumber << " ";
  158.         int thirdConvertedNumber = toDeci(inputCharArrayThirdNumber, i);
  159.        // cout << "third converted number " << thirdConvertedNumber;
  160.  
  161.         if((firstConvertedNumber!=-1) && (secondConvertedNumber!=-1)&& (thirdConvertedNumber!=-1))
  162.             //toDeci() returns -1 if the current digit in it's cycle is greater than the base
  163.             // for example the max digit in number system with base 3 is 2. For base 2 - 1 and etc.
  164.  
  165.         {
  166.             if(state == ADDITION)
  167.             {
  168.                 if((firstConvertedNumber + secondConvertedNumber) == thirdConvertedNumber)
  169.                 {
  170.                     outputV.push_back(i);
  171.                 }
  172.             }
  173.  
  174.             if(state == MULTIPLICATION)
  175.             {
  176.                 if((firstConvertedNumber * secondConvertedNumber) == thirdConvertedNumber)
  177.                 {
  178.                     outputV.push_back(i);
  179.                 }
  180.             }
  181.         } // end if-a -1
  182.  
  183.     }
  184.     sort(outputV.begin(), outputV.end());
  185.   //  cout << endl << "Otpechatvame: " << endl;
  186.     for(int i =0; i<outputV.size();i++)
  187.     {
  188.         cout << outputV[i] << " ";
  189.     }
  190.     outputV.clear();
  191.     cout << endl;
  192.     }// end while
  193.  
  194.  
  195.  
  196. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement