将$\alpha$进制转换为$\beta$进制
$\alpha$范围: 2至16
$\beta$范围: 2至16
将$\alpha$进制根据多项式转换为10进制
这里输入的可能是超过十进制的数,所以类型应该是字符串,
我们将$\alpha$进制的string转换为浮点型
用到基于哈希表建立的图的stl
整数:除基取余,商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); }