进制转换器(C++)

支持2,4,8,16,32进制转换

思路:

1.输入需要转换的进制和数(字符串),倒序进行转换(利用ASCII码,分为数字和大写英文字母)为十进制

  • (数字字符 - 48) *pow(进制,字符总数-所在位置 - 1)
  • (字母字符- 55) * pow(进制,字符总数-所在位置 - 1)

2.输入需要转换为的进制,以大于进制的"上限"(一位最大储存 (进制- 1))为循环判断条件,取余之后压入"栈"中,p = -1记录位置。

3.将最后剩余的一位压入"栈"中

4.出栈,以p = -1为结束条件,以字符串形式将"栈"中数据传入,从p处(栈顶), 输出(当>=10需要转换为大写英文)

 

#include <iostream>
#include <vector>

using namespace std;

int p = -1;

int ConversionFunc(string str, int system) {
    int k = str.size(), ncon = 0;
    for (int i = k - 1; i >= 0; --i) {
        if (str[i] >= 48 && str[i] <= 57) {
            ncon += static_cast<int>((str[i] - 48) * pow(system, k - i - 1));
        }
        else {
            ncon += static_cast<int>((str[i] - 55) * pow(system, k - i - 1));
        }
    }

    return ncon;
}

void push(vector<int> &vec, int n) {
    vec.push_back(n);
    ++p;
}

void pop(vector<int> vec) {
    if (p == -1 || vec.empty()) {
        cout << "栈内没有元素!" << endl;
        return;
    }
    if (vec[p] < 10)
        cout << vec[p];
    else
        cout << static_cast<char>(vec[p] + 55);//强制转换为字符型

    --p;
}

int main()
{
    string str;
    vector<int> vec;
    int sys1, sys2, sum = 0;
    cout << "原来的进制:" << endl;
    cin >> sys1;
    cout << "你要转换的数:" << endl;
    cin >> str;
    sum = ConversionFunc(str, sys1);
    cout << "转换的进制" << endl;
    cin >> sys2;
    while (sum / sys2) {
        push(vec, sum % sys2);
        sum /= sys2;
        /*这里理解,可以像一下,当进行进制转换时(以16进制举例),
        第一位是num * 16^0, 第二位就是num * 16^1,这里sum/=sys2,就是将到下一位时,16^1体现出来
        */
    }
    push(vec, sum);
    cout << "转换到" << sys2 << "进制:" << endl;
    while(p != -1)
        pop(vec);
    cout << endl;
    system("PAUSE");
    return 0;
}

 

 

posted @ 2018-12-24 20:51  Hk_Mayfly  阅读(641)  评论(0)    收藏  举报