Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // C program to convert a number from any base
- // to decimal
- #include <iostream>
- #include <stdio.h>
- #include <string>
- #include <string.h>
- #include <cstdlib>
- #include <cstring>
- #include <sstream> // std::stringstream
- #include <vector>
- #include <algorithm>
- using namespace std;
- int state = 0;
- int signPosition =0;
- int equalSignPosition = 1;
- #define ADDITION 1
- #define MULTIPLICATION 2
- vector <int> outputV; // Vector for the output
- long sstoi(const char *s) // custom stoi function
- {
- long i;
- i = 0;
- while(*s >= '0' && *s <= '9')
- {
- i = i * 10 + (*s - '0');
- s++;
- }
- return i;
- }
- int getFirstNumber(string input, int signPos)
- {
- string newString = input.substr(0,signPos);
- int firstNum = sstoi(newString.c_str());
- return firstNum;
- // cout << "Return first num: " << firstNum << endl;
- }
- int getSecondNumber(string input, int signPos)
- {
- string newString = input.substr(signPos+1, equalSignPosition-signPosition-1);
- int secondNum = sstoi(newString.c_str());
- return secondNum;
- }
- int getThirdNumber(string input, int equalSignPos)
- {
- string newString = input.substr(equalSignPos+1);
- int thirdNumber = sstoi(newString.c_str());
- return thirdNumber;
- }
- int val(char c)
- {
- if (c >= '0' && c <= '9')
- return (int)c - '0';
- else
- return (int)c - 'A' + 10;
- }
- // Function to convert a number from given base 'b'
- // to decimal
- int toDeci(char *str, int base)
- {
- int len = strlen(str);
- int power = 1; // Initialize power of base
- int num = 0; // Initialize result
- int i;
- // Decimal equivalent is str[len-1]*1 +
- // str[len-1]*base + str[len-1]*(base^2) + ...
- for (i = len - 1; i >= 0; i--)
- {
- // A digit in input number must be
- // less than number's base
- if (val(str[i]) >= base)
- {
- //printf("Invalid Number");
- return -1;
- }
- num += val(str[i]) * power;
- power = power * base;
- }
- return num;
- }
- // Driver code
- int main()
- {
- /*
- char str[] = "21";
- int base = 3;
- printf("Decimal equivalent of %s in base %d is "
- " %d\n", str, base, toDeci(str, base));
- return 0;
- */
- int broiTestove = 0;
- cin >> broiTestove;
- cin.ignore();
- string input;
- while(getline(cin, input)){
- // cin.ignore();
- if(input.empty())
- break;
- equalSignPosition = input.find('=');
- if(input.find('+')!=-1)
- {
- state = ADDITION;
- signPosition = input.find('+');
- }
- if(input.find('*')!=-1)
- {
- state = MULTIPLICATION;
- signPosition = input.find('*');
- // cout << "sign * " << endl;
- }
- int firstNum = getFirstNumber(input, signPosition);
- int secondNum = getSecondNumber(input,++signPosition);
- int thirdNum = getThirdNumber(input,++equalSignPosition);
- // cout << "First number: " << firstNum << " second number: " << secondNum << " third number " << thirdNum << endl;
- //Converting the numbers above from int type to char arrays, bcs toDeci() works with char arrays
- string firstNumString;
- string secondNumString;
- string thirdNumString;
- firstNumString = to_string(firstNum);
- secondNumString = to_string(secondNum);
- thirdNumString = to_string(thirdNum);
- char inputCharArrayFirstNumber[firstNumString.size() + 1];
- strcpy(inputCharArrayFirstNumber, firstNumString.c_str()); // or pass &s[0]
- char inputCharArraySecondNumber[secondNumString.size() + 1];
- strcpy(inputCharArraySecondNumber, secondNumString.c_str()); // or pass &s[0]
- char inputCharArrayThirdNumber[thirdNumString.size() + 1];
- strcpy(inputCharArrayThirdNumber, thirdNumString.c_str()); // or pass &s[0]
- //cout << "predi fora" << endl;
- for(int i =2; i<=10; i++)
- {
- // cout << endl;
- //cout << " for index: " << i << " ";
- int firstConvertedNumber = toDeci(inputCharArrayFirstNumber, i);
- // cout << "first converted number " << firstConvertedNumber << " ";
- int secondConvertedNumber = toDeci(inputCharArraySecondNumber, i);
- // cout << "second converted number " << secondConvertedNumber << " ";
- int thirdConvertedNumber = toDeci(inputCharArrayThirdNumber, i);
- // cout << "third converted number " << thirdConvertedNumber;
- if((firstConvertedNumber!=-1) && (secondConvertedNumber!=-1)&& (thirdConvertedNumber!=-1))
- //toDeci() returns -1 if the current digit in it's cycle is greater than the base
- // for example the max digit in number system with base 3 is 2. For base 2 - 1 and etc.
- {
- if(state == ADDITION)
- {
- if((firstConvertedNumber + secondConvertedNumber) == thirdConvertedNumber)
- {
- outputV.push_back(i);
- }
- }
- if(state == MULTIPLICATION)
- {
- if((firstConvertedNumber * secondConvertedNumber) == thirdConvertedNumber)
- {
- outputV.push_back(i);
- }
- }
- } // end if-a -1
- }
- sort(outputV.begin(), outputV.end());
- // cout << endl << "Otpechatvame: " << endl;
- for(int i =0; i<outputV.size();i++)
- {
- cout << outputV[i] << " ";
- }
- outputV.clear();
- cout << endl;
- }// end while
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement