模板小程序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位非负数任意进制转换,包含合法性检查的主要内容,如果未能解决你的问题,请参考以下文章