目录
[2.B3620 x 进制转 10 进制](#2.B3620 x 进制转 10 进制)
[3. P1143 进制转换](#3. P1143 进制转换)
1.B2143进制转换
题目
https://www.luogu.com.cn/problem/B2143
题目描述
用递归算法将一个十进制整数 X(1≤X≤10^9)转换成任意进制数 M(2≤M≤16,M 为整数)。
输入格式
一行两个数,第一个十进制整数 X,第二个为进制 M。
输出格式
输出结果。
输入输出样例
输入 #1
31 16
输出 #1
1F
说明/提示
样例解释。
将十进制 31 转化为十六进制数。
分析
用递归做,注意到是转换成**"任意进制"** ,因此需要存表string table="0123456789ABCDEF";(注意table要定义成全局变量才有用!!),
方法1:每次除M得出的余数x%m直接对应table[x%m],但table[x%m]不能直接打印,需要头插到结果字符串result,即result=table[x%m]+result;
递归返回的条件:x<m(被转换的数字小于m不用转换了),直接头插table[x]后返回
方法2:先尾插,之后使用reverse函数
代码
方法1
cpp
#include <iostream>
using namespace std;
string table="0123456789ABCDEF";
string result;
void f(int x,int m)
{
if (x<m)
{
result=table[x]+result;
return;
}
result=table[x%m]+result;
return f(x/m,m);
}
int main()
{
int x,m;
cin>>x>>m;
f(x,m);
cout<<result;
return 0;
}
提交结果

方法2
cpp
#include <iostream>
#include <algorithm>
using namespace std;
string table="0123456789ABCDEF";
string result;
void f(int x,int m)
{
if (x<m)
{
result.push_back(table[x]);
return;
}
result.push_back(table[x%m]);
return f(x/m,m);
}
int main()
{
int x,m;
cin>>x>>m;
f(x,m);
reverse(result.begin(),result.end());
cout<<result;
return 0;
}
提交结果

★方法3(推荐)
不用创建result字符串,先递归再打印,让x<m的x最先打印
递归调用展开图

cpp
#include <iostream>
using namespace std;
string table="0123456789ABCDEF";
void f(int x,int m)
{
if (x>=m)
{
f(x/m,m);
}
cout<<table[x%m];
}
int main()
{
int x,m;
cin>>x>>m;
f(x,m);
return 0;
}
提交结果

相似题
10进制转x进制 https://www.luogu.com.cn/problem/B3619#submit
只要把string table="0123456789ABCDEF";改成string table="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";即可
2.B3620 x 进制转 10 进制
题目
https://www.luogu.com.cn/problem/B3620
题目描述
给一个小整数 x 和一个 x 进制的数 S。将 S 转为 10 进制数。对于超过十进制的数码,用
A
,B
,...... 表示。输入格式
第一行一个整数 x;
第二行一个字符串 S。
输出格式
输出仅包含一个整数,表示答案。
输入输出样例
输入 #1
16 7B
输出 #1
123
说明/提示
【数据规模和约定】
保证目标数在十进制下不超过 10^9,1≤x≤36。
分析
方法1:遍历一遍字符串,每一位数字乘以对应的权重即可
方法2:库函数stoi(具体参见C16.【C++ Cont】string类字符串的关系运算和与string有关的函数文章)
代码
方法1
cpp
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
string s;
int x,num=0;
cin>>x>>s;
for (int i=s.size()-1;i>=0;i--)
{
if (s[i]<='9')
num+=(s[i]-'0')*pow(x,s.size()-1-i);
else
num+=(s[i]-'A'+10)*pow(x,s.size()-1-i);
}
cout<<num;
return 0;
}
提交结果

方法2
cpp
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
int x,num=0;
cin>>x>>s;
cout<<stoi(s,NULL,x);
return 0;
}
提交结果

3. P1143 进制转换
题目
https://www.luogu.com.cn/problem/P1143
题目描述
请你编一程序实现两种不同进制之间的数据转换。
输入格式
共三行,第一行是一个正整数,表示需要转换的数的进制 n (2≤n≤16),第二行是一个 n 进制数,若 n>10 则用大写字母 A∼F 表示数码 10∼15,并且该 n 进制数对应的十进制的值不超过 10^9,第三行也是一个正整数,表示转换之后的数的进制 m (2≤m≤16)。
输出格式
一个正整数,表示转换之后的 m 进制数。
输入输出样例
输入 #1
16 FF 2
输出 #1
11111111
代码
有了前两道题的基础,这道题顺风顺水,直接复制粘贴前面的代码
cpp
#include <iostream>
#include <string>
using namespace std;
string table="0123456789ABCDEF";
void f(int x,int m)
{
if (x>=m)
{
f(x/m,m);
}
cout<<table[x%m];
}
int main()
{
string s;
int from_x,to_x,num=0;
cin>>from_x>>s;
int tmp=stoi(s,NULL,from_x);
cin>>to_x;
f(tmp,to_x);
return 0;
}
提交结果
