洛谷P1143 进制转换

进制转换

洛谷题目链接:https://www.luogu.com.cn/problem/P1143#submit

题目描述

请你编一程序实现两种不同进制之间的数据转换。

输入格式

共三行,第一行是一个正整数,表示需要转换的数的进制 n(2<=n<=16),第二行是一个 n 进制数,若 n>10 则用大写字母 A-F 表示数码10-15 ,并且该 n 进制数对应的十进制的值不超过 10^9,第三行也是一个正整数,表示转换之后的数的进制m(2<=m<=16)。

输出格式

一个正整数,表示转换之后的 m 进制数。

样例 #1

样例输入 #1

16
FF
2

样例输出 #1

11111111

思路:

  1. 这题我们可以先将输入的进制的数字先转化为我们熟悉的10进制数字,再通过对十进制数字转化成我们需要的m进制。
  2. 如何将n进制的数字转化为10进制呢?我们都知道2进制如何转化为10进制,就是从2进制的最后一位开始,当前数字*20+当前数字*21+....一直这样下去,直到到达2进制数字的第一位结束。那么我们也可以对n进制的数字这样操作,只需要将2改为n即可,这个步骤的代码如下:
// r进制的数转化为10进制
int to_10(string s, int r) {
int result = 0;
int flag = 0;
for (int i = s.size() - 1; i >= 0; i--) {
int current;
if (s[i] >= '0' && s[i] <= '9') {
current = s[i] - '0';
}
else { //如果这个位置不是数字表示的,就把它转化为数字表示
current = s[i] - 'A' + 10;
}
result += current * pow(r, flag++);
}
return result;
}
  1. 然后,我们将我们熟悉的二进制的数字转化为m进制即可,如何转化为m进制呢?同样我们还是以二进制举例,我们知道,对十进制的数字一直对2取余的结果,最后再倒序输出,最后的结果就是二进制了,同样的我们将2改为m,就可以将十进制的数字改为m进制,这个阶段的代码如下:
//十进制数转化成R进制
string to_R(int n, int r)
{
string result;
if (n == 0) return result;
while (n) {
//求余数
int remainder = n % r;
if (remainder < 10) result = char(remainder + '0') + result;
else result = char(remainder - 10 + 'A') + result;
//更新n的值
n /= r;
}
return result;
}

最后,整个程序的C++代码如下:

#include<iostream>
using namespace std;
#include<cmath>
// r进制的数转化为10进制
int to_10(string s, int r) {
int result = 0;
int flag = 0;
for (int i = s.size() - 1; i >= 0; i--) {
int current;
if (s[i] >= '0' && s[i] <= '9') {
current = s[i] - '0';
}
else { //如果这个位置不是数字表示的,就把它转化为数字表示
current = s[i] - 'A' + 10;
}
result += current * pow(r, flag++);
}
return result;
}
//十进制数转化成R进制
string to_R(int n, int r)
{
string result;
if (n == 0) return result;
while (n) {
//求余数
int remainder = n % r;
if (remainder < 10) result = char(remainder + '0') + result;
else result = char(remainder - 10 + 'A') + result;
//更新n的值
n /= r;
}
return result;
}
int main()
{
int n, m;
string s;
cin >> n >> s >> m;
int result = to_10(s, n);
string res=to_R(result, m);
cout << res << endl;
return 0;
}
posted @   Tomorrowland_D  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示