模拟:进制转换

首先我们介绍十进制转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 }
原文地址:https://www.cnblogs.com/aininot260/p/9305626.html