1. 程式人生 > >2~62位任意進制轉換(c++)

2~62位任意進制轉換(c++)

rtmp end iostream 思路 [0 代碼 () objc blog

進制轉換的符號表為[0-9a-zA-Z],共61個字符,最大可表示62進制。

思路是原進制先轉換為10進制,再轉換到目標進制。

疑問:

  對於負數,有小夥伴說可以直接將符號丟棄,按照整數進行進位轉換,最後再將負號補回來,我認為這種做法是不對的。

  正確的做法是:考慮好按照16位(short)還是32位(int)抑或64位(long long),先求出二進制補碼(這時候就正負數就統一了),將二進制數轉換為十進制後在轉換為其他進制(如果有小夥伴知道如何直接將二進制轉換為任意進制的方法可以留言告訴我,不勝感激。註意這裏的任意進制不是單純的8 16等2的冪次進制,還有其他的比如7、9等)。

下面貼上這種我認為針對負數的處理方法不太合適的代碼:

輸入格式:原進制,目標進制,原進制下的數字(用字符串表示)

輸出格式:目標進制下的數字

 1 #include <iostream>
 2 #include <string>
 3 #include <cmath>
 4 using namespace std;
 5 
 6 //將任意字符轉換為十進制,其中a-z代表10-35,A-Z代表36-61,用對應的ASCII碼調整就好
 7 long long convertToDec(char c)
 8 {
 9   long long
decNum; 10 if(c>=a && c<=z) 11 decNum=c-87; 12 else if(c>=A && c<=Z) 13 decNum=c-29; 14 else if(c>=0 && c<=9) 15 decNum=c-48; 16 17 return decNum; 18 } 19 20 //將十進制轉換為這些字符 21 char convertToDec(long long c) 22 { 23 long
long objchar; 24 if(c>=10 && c<=35) 25 objchar=c+87; 26 else if(c>=36 && c<=61) 27 objchar=c+29; 28 else if(c>=0 && c<=9) 29 objchar=c+48; 30 31 return objchar; 32 } 33 34 int main() 35 { 36 int src; 37 int obj; 38 string num; 39 40 while(cin>>src>>obj>>num) 41 { 42 43 bool IsNegative=false; 44 if(num[0]==-) 45 { 46 num.erase(0); 47 IsNegative=true; 48 } 49 50 long long decNum=0;//十進制數(中間數) 51 for(long long i=0;i<num.size();++i) 52 decNum+=convertToDec(num[i])*pow(src,num.size()-1-i); 53 54 string strTmp; 55 long long tmp; 56 while(decNum>0) 57 { 58 tmp=decNum % obj; 59 strTmp=convertToDec(tmp)+strTmp; 60 decNum/=obj; 61 } 62 63 if(IsNegative) 64 strTmp=-+strTmp; 65 cout<<strTmp<<endl; 66 } 67 68 return 0; 69 }

還望指教。

2~62位任意進制轉換(c++)