zoukankan      html  css  js  c++  java
  • 模拟:进制转换

    首先我们介绍十进制转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 }
  • 相关阅读:
    eclipse的优化 gc.log
    一次使用Eclipse Memory Analyzer分析Tomcat内存溢出
    JVM系列三:JVM参数设置、分析
    热加载
    彻底理解JAVA动态代理
    Linux下查看Web服务器当前的并发连接数和TCP连接状态
    个人博客 V0.0.3 版本 ...
    HTML5本地存储——IndexedDB(一:基本使用)
    如何在Blog中加入Google Analytics
    webpack中实现按需加载
  • 原文地址:https://www.cnblogs.com/aininot260/p/9305626.html
Copyright © 2011-2022 走看看