将$\alpha$进制转换为$\beta$进制

将$\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);
}
上一篇:2021牛客暑期多校训练营5 J. Jewels(二分图最大权匹配)


下一篇:ExtendsMethod