1. 程式人生 > >【模板小程序】2~62位非負數任意進制轉換,包含合法性檢查

【模板小程序】2~62位非負數任意進制轉換,包含合法性檢查

code 中間 lower col while num 負數 tolower gin

  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位非負數任意進制轉換,包含合法性檢查