进制转换器(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; }


浙公网安备 33010602011771号