将$\alpha$进制转换为$\beta$进制
两个进制范围
$\alpha$范围: 2至16
$\beta$范围: 2至16
原理:
$\alpha$进制转10进制
将$\alpha$进制根据多项式转换为10进制
这里输入的可能是超过十进制的数,所以类型应该是字符串,
我们将$\alpha$进制的string转换为浮点型
用到基于哈希表建立的图的stl
将10进制转换为$\beta$进制
整数:除基取余,商0位止,倒序取余;
小数:乘基取整,去整乘基,顺序取整;
#include<iostream>
#include<math.h>
using namespace std;
#include<cstring>
#include<map>
class trans{
//af进制转换bt进制
//af<=10
//bt<=16
//输入:af->bt进制,浮点型数字(af进制),输出 (bt)进制
public:
int af;
int bt;
char a[16];
map<char,int> m1;
string f1(float n1);//10转bt进制整数
string f2(float n); //10转bt进制整小数
float f(string n);//总函数
float f0(string n);//af转10进制 由字符串转成浮点数
trans(int x,int y):af(x),bt(y)
{
char b[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
strcpy(a,b);
m1.emplace('0',0);
m1.emplace('1',1);
m1.emplace('2',2);
m1.emplace('3',3);
m1.emplace('4',4);
m1.emplace('5',5);
m1.emplace('6',6);
m1.emplace('7',7);
m1.emplace('8',8);
m1.emplace('9',9);
m1.emplace('A',10);
m1.emplace('B',11);
m1.emplace('C',12);
m1.emplace('D',13);
m1.emplace('E',14);
m1.emplace('F',15);
//访问
//m1.find('0')->second;
}
};
float trans::f0(string n)
{
// int left=n;
// float right=n-left,y=right;
// int x=left,count=0;
//
// float res=0;
// while(x>0)
// {
// static int pow=1;
// res+=x%10*pow;
// pow*=af;
// x/=10;
// }
// x=left;
//
//
// while(y-floor(y)!=0)
// {
// static float pow=1;
// pow/=af;
// y*=10;
// int w=floor(y);
// res+=(w%10)*pow;
// }
//string n;
int size=n.size();
int dot=-1;
for(int i=0;i<size;i++)
{
if(n[i]=='.')
dot=i;
}
if(dot==-1)
dot=size;
float res=0;
int dleft=dot-1;
while(dleft>=0)
{
static int pow =1;
res+=m1.find(n[dleft])->second*pow;
pow*=af;
dleft--;
}
int dright=dot+1;
while(dright<=size)
{
static float pow=1;
pow/=af;
res+=m1.find(n[dright])->second*pow;
dright++;
}
return res;
}
string trans::f1(float n1)
{
char m[100];
int n=n1;
int top=-1;
string s1;
while(n!=0)
{
// m[++top]=n%2;
m[++top]=a[n%bt];
n=n/bt;
}
while(top!=-1)
{
s1+=m[top--];
}
return s1;
}
string trans::f2(float n)
{
int count=5;
string s1;
while(count!=0)
{
n=n*bt;
s1+=a[int(n)];
n=n-floor(n);
count--;
}
return s1;
}
float trans::f(string n)
{
float tran1=f0(n);
string s1=f1(floor(tran1));
string s2=f2(tran1-floor(tran1));
//判断是否输出小数点及后面位数;
bool flag=0;
for(string::iterator i1=s2.begin();i1!=s2.end();i1++)
{
if(*i1!='0')
{
flag=1;
break;
}
}
if(flag==1)
{
string s3=".";
s1+=s3;
s1+=s2;
}
float res=atof(s1.c_str());
cout<<s1;
}
int main()
{
int af,bt;
cin>>af>>bt;
string s1;
cin>>s1;
trans t(af,bt);
t.f(s1);
}