10进制 <==> P进制
P<=10:0~9p>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】
#include<cstdio> #include<string> 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; }