B2143 进制转换 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目描述
用递归算法将一个十进制数 转换成任意进制数 ()。
输入格式
一行两个数,第一个十进制数 ,第二个为进制 。
输出格式
输出结果。
样例 #1
样例输入 #1
31 16
样例输出 #1
1F
提示
样例解释。
将十进制 转化为十六进制数。
题解
思路
题目要实现任意进制的转换,我们应该回到进制转换的基本思路,研究输入的数字在不同进制下的组成,比如题目中所给的将十进制 转化为十六进制数,直观上可以看出 是由 个 和 个 组成的。因此,我们在转换时,可以考虑采用递归,通过除法和取余对数字进行转换。
代码
#include <bits/stdc++.h>
using namespace std;
void convert(int x, int m){
if(!x) return;
convert(x / m, m);
if(x % m < 10) {
cout << x % m; //先递归,再输出
}
else
cout << (char)(x % m + 'A' - 10); //大于9的特殊处理
}
int main(){
int x, m;
cin >> x >> m;
convert(x, m); //调用
return 0;
}
过程分析
以 convert(276,16) 为例,给出递归调用的整个过程:
convert(276, 16);
convert(17, 16);
convert(1, 16);
convert(0, 16);
return;
cout << '1';
cout << '1';
cout << '4';
得到结果为 。
再来看一道类似的题目
描述
输入一个整数,将其转换成八进制数输出。
输入描述:
输入包括一个整数N(0<=N<=100000)。
输出描述:
可能有多组测试数据,对于每组数据, 输出N的八进制表示数。
示例
输入:
7
8
9
输出:
7
10
11
题解 1
这个题可以直接调用上一题中编写的函数,代码如下
#include <bits/stdc++.h>
using namespace std;
void convert(int x, int m){
if(!x) return;
convert(x / m, m);
if(x % m < 10) {
cout << x % m;
} else {
cout << (char)(x % m + 'A' - 10);
}
}
int main(){
int x;
while(cin >> x) {
convert(x, 8); // 调用 convert 函数进行进制转换
cout << endl;
}
return 0;
}
题解 2
也可以采用 C++ 的一些其他技巧,比如
#include<iostream>
using namespace std;
int main() {
int N;
while(cin>>N) {
cout << oct < N << endl;
}
return 0;
}
C++ 中的 cout 提供了一些操纵符,这些操纵符可以用于修改输出流的一些属性或执行一些特殊的操作。这里列出一些常用的操纵符:
-
std::endl:用于插入一个换行符并刷新输出缓冲区。相当于'\n'。std::cout << "Hello" << std::endl; -
std::setw:设置域宽(字段宽度),用于控制下一个输出项的宽度。#include <iomanip> // ... std::cout << std::setw(5) << 42; // 输出宽度为5的整数,不足的部分用空格填充 -
std::setprecision:设置输出流的精度,用于控制浮点数的小数位数。#include <iomanip> // ... std::cout << std::setprecision(2) << 3.14159; // 输出浮点数,保留两位小数 -
std::fixed:以固定点表示法输出浮点数,保留小数点后的位数。#include <iomanip> // ... std::cout << std::fixed << 3.14159; // 输出浮点数,保留小数点后所有位数 -
std::scientific:以科学计数法表示浮点数。#include <iomanip> // ... std::cout << std::scientific << 3000.0; // 输出浮点数,以科学计数法表示 -
std::boolalpha:以文字形式而非数字形式输出布尔值。std::cout << std::boolalpha << true; // 输出 "true" 而不是 "1" -
std::hex、std::oct、std::dec:分别以十六进制、八进制、十进制输出整数。std::cout << std::hex << 255; // 输出十六进制数 -
std::showbase:显示整数的进制前缀(如0x表示十六进制)。std::cout << std::showbase << std::hex << 255; // 输出 "0xFF"