1.定义头文件
#pragma once
#ifndef CCONVERT
#define CCONVERT
#include <atlstr.h>
#include <string>
class CConvert
{
public:
//任意进制转十进制(All Radix to Int) 参数:任意进制字符串 进制R 作用:利用按权展开加和,返回十进制
long int Atoi(std::string& S, int R);
//十进制转任意进制(Int to All Radix)参数:十进制数Num,进制R 作用:利用除留余数法,返回逆序的余数,即返回所要转换的进制数
std::string Itoa(int Num, int R);
private:
int power(int R, int turn);
};
void CConvertDemo2();
#endif // !CCONVERT
2.定义实现文件
#include "CConvert.h"
#include <iostream>
using std::string;
using std::cout;
using std::endl;
//进制权值
int CConvert::power(int R, int turn)
{
int ans = 1;
while (turn--)
{
ans = ans * R;
}
return ans;
}
//任意进制转十进制(All Radix to Int) 参数:任意进制字符串 进制R 作用:利用按权展开加和,返回十进制
long int CConvert::Atoi(string& S, int R) {
long int ans = 0;
long int a;
long int b;
long int c;
char t;
for (int i = 0; i < S.size(); i++)//按权展开
{
t = S[i];
if (t >= '0' && t <= '9') {
a = S[i] - '0';
}
else {
a = S[i] - 'A' + 10;
}
b = power(R, S.size() - i - 1);
c = a * b;
ans += c;
}
return ans;
}
//十进制转任意进制(Int to All Radix)参数:十进制数Num,进制R 作用:利用除留余数法,返回逆序的余数,即返回所要转换的进制数
string CConvert::Itoa(int Num, int R){
string remain = "";
int temp;
do {
temp = Num % R;//取余
Num /= R;
if (temp >= 10)
remain += temp - 10 + 'A';//任意进制为大于基数大于10的进制 例如,十六进制
else remain += temp + '0';
} while (Num);
reverse(remain.begin(), remain.end());//逆序
return remain;
}
void CConvertDemo2() {
CConvert cct;
int num = 15;
string s_result;
long int n_result;
s_result = cct.Itoa(num,16);
cout << "十进制 " << num << " 转为十六进制="<<s_result << endl;
n_result = cct.Atoi(s_result, 16);
cout << "十六进制 " << s_result << " 转十进制=" << n_result << endl;
}