進制轉換的符號表為[0-9a-zA-Z],共61個字符,最大可表示62進制。
思路是原進制先轉換為10進制,再轉換到目標進制。
疑問:
對于負數,有小伙伴說可以直接將符號丟棄,按照整數進行進位轉換,最后再將負號補回來,我認為這種做法是不對的。
正確的做法是:考慮好按照16位(short)還是32位(int)抑或64位(long long),先求出二進制補碼(這時候就正負數就統一了),將二進制數轉換為十進制后在轉換為其他進制(如果有小伙伴知道如何直接將二進制轉換為任意進制的方法可以留言告訴我,不勝感激。注意這里的任意進制不是單純的8 16等2的冪次進制,還有其他的比如7、9等)。
下面貼上這種我認為針對負數的處理方法不太合適的代碼:
輸入格式:原進制,目標進制,原進制下的數字(用字符串表示)
輸出格式:目標進制下的數字
#include <iostream> #include <string> #include <cmath> using namespace std; //將任意字符轉換為十進制,其中a-z代表10-35,A-Z代表36-61,用對應的ASCII碼調整就好 long long convertToDec(char c) { long long decNum; if(c>='a' && c<='z') decNum=c-87; else if(c>='A' && c<='Z') decNum=c-29; else if(c>='0' && c<='9') decNum=c-48; return decNum; } //將十進制轉換為這些字符 char convertToDec(long long c) { long long objchar; if(c>=10 && c<=35) objchar=c+87; else if(c>=36 && c<=61) objchar=c+29; else if(c>=0 && c<=9) objchar=c+48; return objchar; } int main() { int src; int obj; string num; while(cin>>src>>obj>>num) { bool IsNegative=false; if(num[0]=='-') { num.erase(0); IsNegative=true; } long long decNum=0;//十進制數(中間數) for(long long i=0;i<num.size();++i) decNum+=convertToDec(num[i])*pow(src,num.size()-1-i); string strTmp; long long tmp; while(decNum>0) { tmp=decNum % obj; strTmp=convertToDec(tmp)+strTmp; decNum/=obj; } if(IsNegative) strTmp='-'+strTmp; cout<<strTmp<<endl; } return 0; }
以上這篇2~62位任意進制轉換方法(c++)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。