进制转换

文章目录

  • 模板
  • 举例

模板

// 10进制转为d进制:n转为arr
vector<int> vect;	//arr[0]为低位
while(n!=0){
	vect.push_back(n%d);		// 先存n的低位
    n = n/d;
}
// d进制转为10进制:vect转为n
n=0;
for(int i=vect.size()-1; i>=0; i--){	//从d进制高位开始
	n = n*d + vect[i];
}

举例

10进制 <==> P进制

  • P<=10:0~9
  • p>10:0~9,A,B,C…

举例
p = 8:168 【10】= 8 2 ∗ ( 2 ) + 8 ∗ ( 5 ) + ( 0 ) 8^2*(2) + 8*(5) + (0) 82(2)+8(5)+(0) = 250【8】
p = 13: 129 【10】= 8 ∗ ( 9 ) + ( 12 ) 8*(9) + (12) 8(9)+(12) = 9C【13】

进制转换_第1张图片

#include
#include

using namespace std;

string base[16] = {"zero","one","two","three","four",
"five","six","seven","eight","nine","A","B","C","D","E","F"};

string strs[20];   //假设P进制最多20位
int k;      // P进制实际k位



// 168【10】 = 8*(9) + (12) = nine C【13】
// k位p进制 ==> 10进制
int index_base(string s){
    for(int i=0; i<16; i++){
        if(base[i]==s){
            return i;
        }
    }
}
int p_to_ten(int p){
    int n=0, temp=1;
    for(int i=k-1; i>=0; i--){      // 倒读
        //str_p[i]转为数字:映射base下标
        int t = index_base(strs[i]);
        //
        n += (t*temp);
        temp *= p;
    }
    return n;
}
// 10进制 ==> k位p进制
void ten_to_p(int n, int p){
    int i=0;
    while(n!=0){
        strs[i] = base[n%p];
        n = n/p;
        i++;
    }
    k = i;
}

int main(){
    //13进制 转 10进制
    strs[0] = "nine";
    strs[1] = "C";
    k = 2;
    printf("%d\n",p_to_ten(13));
    //10进制 转 13进制
    ten_to_p(129, 13);
    for(int i=k-1; i>=0; i--){  //因为strs倒存,要逆序输出
        printf("%s ", strs[i].c_str());
    }

    return 0;
}

你可能感兴趣的:(数据结构,&,算法)