模板小程序2~62位非负数任意进制转换,包含合法性检查

Posted xiaoxi666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板小程序2~62位非负数任意进制转换,包含合法性检查相关的知识,希望对你有一定的参考价值。

  1 //进制转换模块
  2 #include <iostream>
  3 #include <string>
  4 #include <cmath>
  5 #include <algorithm>
  6 
  7 using namespace std;
  8 
  9 //将任意字符转换为十进制 [0-9a-zA-Z],61个字符,最大表示62进制
 10 int convertToDec(char c)
 11 {
 12     int decNum;
 13     if(c>=0 && c<=9)
 14         decNum=c-48;
 15     else if(c>=a && c<=z)
 16         decNum=c-87;
 17     else if(c>=A && c<=Z)
 18         decNum=c-29;
 19 
 20     return decNum;
 21 }
 22 
 23 //将十进制转换为这些字符 [0-9a-zA-Z],61个字符,最大表示62进制
 24 char convertFromDec(int c)
 25 {
 26     char objchar;
 27     if(c>=0 && c<=9)
 28         objchar=c+48;
 29     else if(c>=10 && c<=35)
 30         objchar=c+87;
 31     else if(c>=36 && c<=61)
 32         objchar=c+29;
 33 
 34     return objchar;
 35 }
 36 
 37 //从原进制转换为2~62的任意进制
 38 string convert(int src,int obj,string num_str)
 39 {
 40     //    string num_str=to_string(num);
 41     long long decNum=0;//十进制数(中间数)
 42     for(int i=0;i<(int)num_str.size();++i)
 43         decNum+=convertToDec(num_str[i])*pow(src,num_str.size()-1-i);
 44 
 45     string strTmp;
 46     long long tmp;
 47     while(decNum>0)
 48     {
 49         tmp=decNum % obj;
 50         strTmp=convertFromDec(tmp)+strTmp;
 51         decNum/=obj;
 52     }
 53     return strTmp;
 54 }
 55 
 56 //合法性检查,M为源进制
 57 bool IsVaild(const string& src_num,int M)
 58 {
 59     if(M>=2 && M<=10)//2-10进制
 60     {
 61         for(int i=0;i<(int)src_num.length();++i)
 62         {
 63             if(src_num[i]<0 || src_num[i]-0>=M)
 64             {
 65                 return false;
 66             }
 67         }
 68     }
 69     else if(M>=11 && M<=36)
 70     {
 71         for(int i=0;i<(int)src_num.length();++i)
 72         {
 73             if(!((src_num[i]>=0 && src_num[i]-0<M)
 74                  ||  (src_num[i]>=a && src_num[i]-a<M)))
 75             {
 76                 return false;
 77             }
 78         }
 79     }
 80     else if(M>=37 && M<=62)
 81     {
 82         for(int i=0;i<(int)src_num.length();++i)
 83         {
 84             if(!((src_num[i]>=0 && src_num[i]-0<M)
 85                  ||  (src_num[i]>=a && src_num[i]-a<M)
 86                     ||(src_num[i]>=A && src_num[i]-A<M)))
 87             {
 88                 return false;
 89             }
 90         }
 91     }
 92     return true;
 93 }
 94 
 95 //M进制转换为N进制,数字以string形式给出,需包含合法性检查
 96 int main()
 97 {
 98     int M,N;//M进制转换为N进制
 99     string src_num;//M进制的数
100     while(cin>>M>>N>>src_num)
101     {
102         //如果不超过36进制,大小写无所谓,可统一转换为小写
103         //transform(src_num.begin(),src_num.end(),src_num.begin(),::tolower);
104         if(!IsVaild(src_num,M))
105         {
106             cout<<"数据不合法"<<endl;
107             continue;
108         }
109         string obj_num;//N进制的数
110         obj_num=convert(M,N,src_num);
111         cout<<obj_num<<endl;
112     }
113     return 0;
114 }

 

以上是关于模板小程序2~62位非负数任意进制转换,包含合法性检查的主要内容,如果未能解决你的问题,请参考以下文章

模板小程序任意长度十进制数转化为二进制(java实现)

2~16进制间任意进制转换器

任意进制转换算法

任意进制转换算法

Int32 最大的数值是多少???(附十进制十六进制相互转换且包含正负数的java代码)

51nod 1315 合法整数集 (位操作理解模拟进制转换)