首页 > 代码库 > 【模板小程序】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位非负数任意进制转换,包含合法性检查
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。