任意进制转十进制
1101(2)= 1*2^0 + 0 * 2^1 + 1 *2^2 + 1* 2^3
ABC(16) = C*16^0 + B*16^1 + A*16^2 = 12*16^0 + 11*16^1 + 10*16^2
这里需要注意计算时需要将字母转成数字进行计算。比如A=>10 F=>15
'A'-'0'-7 即可将字符‘A'转成数字 10
用ans记录每一项相加的结果,用k来记录位数计算到几次方了。
#includeusing namespace std;int r_to_ten(string s, int r)//A2(16)=2*16^0+A*16^1=162 r进制的数s转成10进制 {int len = s.length();int ans = 0;//记录每一项相加的结果 int k = 1;//记录位数 for(int i = len-1; i >= 0; i--){if(s[i] >= 'A') ans += (s[i]-'0'-7)*k;//大于10的数需要将字母转成数字 else ans += (s[i]-'0')*k;//小于10的数直接相乘即可 k*=r;}return ans; } int main(){cout << r_to_ten("12323",4) << endl;//443cout << r_to_ten("A2",16);//162 return 0;}
![a42210bfe116a510f45c211d10559501.gif](https://img-blog.csdnimg.cn/img_convert/a42210bfe116a510f45c211d10559501.gif)
十进制转任意进制
123(10) 转为2 进制,需要不断的除以2,余数倒序输出。
数组的做法:
#includeusing namespace std;string r_to_ten(int n, int r)//将10进制的n转为r进制 23 2{char str[105] = {0}, s[105] = {0};int k = 0;while(n!=0){str[k++] = n%r;//将余数直接存起来 n = n/r;}int m = 0;for(int i = k-1; i >= 0; --i)//倒序输出余数即为转换后的答案 {if(str[i] >= 10 ) s[m++] = str[i] - 10 + 'A';//大于10时数字转字符 如10 -> A else s[m++] = str[i] + '0';//数字转字符 } return s;}int main(){cout << r_to_ten(1024,16);return 0;}
![a42210bfe116a510f45c211d10559501.gif](https://img-blog.csdnimg.cn/img_convert/a42210bfe116a510f45c211d10559501.gif)
栈的做法:
#includeusing namespace std;string r_to_ten(int n, int r)//将10进制的n转为r进制 23 2{char s[105] = {0};int k = 0;stack str; while(n!=0){str.push(n%r);//将余数存在栈中 n = n/r;}int m = 0;while(!str.empty())//倒序输出余数即为转换后的答案 {int t = str.top();if(t >= 10 ) s[m++] = t - 10 + 'A';//大于10时数字转字符 如10 -> A else s[m++] = t + '0';//数字转字符 str.pop();} return s;}int main(){cout << r_to_ten(1235,8);return 0;}
![a42210bfe116a510f45c211d10559501.gif](https://img-blog.csdnimg.cn/img_convert/a42210bfe116a510f45c211d10559501.gif)