16进制数组转成10进制 qt_信息学奥赛:十进制与任意进制之间的转换

任意进制转十进制

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

十进制转任意进制

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

栈的做法:

#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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值