• 进制转换模板


     1 #define MAXN 20
     2 int t[MAXN],A[MAXN],n;
     3 char OldData[MAXN],NewData[MAXN];  //转换前、后的数据
     4 int olds,news;                     //转换前、后的进制
     5 void trans()//调用方式:输入olds、news、OldData,然后调用trans(),输出NewData
     6 {
     7     int i,len,k;
     8     len=strlen(OldData);
     9     for(i=len;i>=0;i--) t[len-1-i] = OldData[i] - (OldData[i]<='9' ? 48 : (OldData[i]<'a' ? 55 : 61));//将字符串转化成0~61 
    10     for(k=0;len;)
    11     {
    12         for(i=len;i>=1;i--)
    13         {
    14             t[i-1]+=t[i]%news*olds;
    15             t[i]/=news;
    16         }
    17         A[k++]=t[0]%news;
    18         t[0]/=news;
    19         while(len>0 && !t[len-1]) len--;
    20     }
    21     NewData[k]='';
    22     for(i=0;i<k;i++) NewData[k-1-i] = A[i] + (A[i]<10 ? '0' : (A[i]<36 ? 55 : 61));
    23 }

    最大62进制:[0~9,A~Z,a~z]

    原理:

    例如我们将10进制的5031转换成2进制:

    使用这种不断除二取余的方法,我们就可以得到2进制数:1001110100111

    同样的,我们对于任意的两个进制间的转换也使用这种方法,例如将16进制的15BDE转换成8进制的:

    在这里,我们要把B(11)、D(13)、E(14)都看作一位,并且除法中高位的余数,加到低位上时,不再是乘10,而是乘16,

    例如最后15/8时,1/8=0余1,这时5+(1*16)=21,21/8=2余5,就在右边写上5即可。

    而上面那个模板的算法,就是模拟这种计算过程。

    用更加通俗易懂的方式来重写上面那个模板:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<stack>
     4 #define MAXN 20
     5 using namespace std; 
     6 stack<int> ans;
     7 int t[MAXN],n;
     8 char OldData[MAXN],NewData[MAXN];  //转换前、后的数据
     9 int olds,news;                     //转换前、后的进制
    10 void trans()//调用方式:输入olds、news、OldData,然后调用trans(),输出NewData
    11 {
    12     int i,len,k=0;
    13     len=strlen(OldData);
    14     for(i=len-1;i>=0;i--) t[len-1-i] = OldData[i] - (OldData[i]<='9' ? 48 : (OldData[i]<'a' ? 55 : 61));//将字符串转化成0~61 
    15     while(len)
    16     {
    17         for(i=len-1;i>=1;i--)
    18         {
    19             t[i-1]+=t[i]%news*olds;
    20             t[i]/=news;
    21         }
    22         ans.push(t[0]%news);//得到一个余数,放入结果栈
    23         t[0]/=news;
    24         //for(i=len-1;i>=0;i--) printf("%d ",t[i]); printf("
    ");
    25         while(len>0 && !t[len-1]) len--;//去掉做完除法后,前面那些零 
    26     }
    27      
    28     int cnt=0;
    29     while(!ans.empty())
    30     {
    31         NewData[cnt++] = ans.top() + (ans.top()<10 ? '0' : (ans.top()<36 ? 55 : 61));
    32         ans.pop(); 
    33     }
    34 }
    35 int main()
    36 {
    37     while(1)
    38     {
    39         scanf("%s",OldData);
    40         scanf("%d%d",&olds,&news);
    41         trans();
    42         printf("%s
    ",NewData);
    43     }
    44 } 
  • 相关阅读:
    TCP详解——传输控制协议(总述)
    sublime text3使用插件SublimeTextTrans设置透明度
    vue学习1
    js事件绑定/监听
    如何成为顶级程序猿
    HTML5中meta属性
    windows安装SVN服务器并设置开机启动
    oracle安装登录sqlplus / as sysdba然后报错ERROR: ORA-01031 insufficient privileges
    移动端和PC端有什么区别
    div+css通用兼容性代码整理
  • 原文地址:https://www.cnblogs.com/dilthey/p/7141714.html
Copyright © 2020-2023  润新知