ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-09-27 23:35:49  阅读:186  来源: 互联网

标签:emplace 进制 int float beta m1 alpha string


将$\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);
}

标签:emplace,进制,int,float,beta,m1,alpha,string
来源: https://www.cnblogs.com/aoidayo/p/15345853.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有