首页 > 代码库 > 【模板小程序】2~62位非负数任意进制转换,包含合法性检查

【模板小程序】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位非负数任意进制转换,包含合法性检查