首先我们介绍十进制转m进制,使用除m取余法,注意这里所描述的都是整数之间的转换,,不涉及小数部分所谓的乘m取整法
为了便于显示结果,我们这里引入了一个字符串翻转函数
char* strrev(char* s) { char* h=s; char* t=s; while(*t++); t-=2; while(h<t) { char ch=*h; *h++=*t; *t--=ch; } return s; }
我们使用b数组来存放没一个数对应的字符,不用打表
void init() { for(int i=0;i<=9;i++) b[i]=char(i+'0'); for(int i=10;i<=15;i++) b[i]=char(i+55); }
核心逻辑很简单:
while(n) { a[cnt++]=b[n%m]; n/=m; }
接下来给出10进制转m进制的完整实现:
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 int n,m; 5 char a[15]; 6 char b[20]; 7 char* strrev(char* s) 8 { 9 char* h=s; 10 char* t=s; 11 while(*t++); 12 t-=2; 13 while(h<t) 14 { 15 char ch=*h; 16 *h++=*t; 17 *t--=ch; 18 } 19 return s; 20 } 21 void init() 22 { 23 for(int i=0;i<=9;i++) 24 b[i]=char(i+'0'); 25 for(int i=10;i<=15;i++) 26 b[i]=char(i+55); 27 } 28 int main() 29 { 30 init(); 31 cin>>n>>m; 32 int cnt=0; 33 while(n) 34 { 35 a[cnt++]=b[n%m]; 36 n/=m; 37 } 38 strrev(a); 39 for(int i=0;i<cnt;i++) 40 cout<<a[i]; 41 return 0; 42 }
接下来我们介绍m进制转十进制,使用的方法是乘权累加法
为了方便我们使用一个字符到对应数字的映射
然后我们定义一个计算幂的函数
int get_power(int x,int n) { int tmp=1; for(int i=1;i<=n;i++) { tmp*=x; } return tmp; }
接下来,直接计算乘方之和就好了
for(int i=0;i<len;i++) ans+=a[n[i]]*get_power(m,len-i-1);
完整的实现如下:
1 #include<iostream> 2 #include<map> 3 using namespace std; 4 string n; 5 int m; 6 map<char,int> a; 7 int ans=0; 8 int get_power(int x,int n) 9 { 10 int tmp=1; 11 for(int i=1;i<=n;i++) 12 { 13 tmp*=x; 14 } 15 return tmp; 16 } 17 void init() 18 { 19 for(int i=0;i<=9;i++) 20 a[char(i+'0')]=i; 21 for(int i=65;i<=70;i++) 22 a[char(i)]=i-55; 23 } 24 int main() 25 { 26 init(); 27 cin>>n>>m; 28 int len=n.size(); 29 for(int i=0;i<len;i++) 30 ans+=a[n[i]]*get_power(m,len-i-1); 31 cout<<ans<<endl; 32 return 0; 33 }