洛谷 B2143 进制转换 题解(C++版)

377 阅读3分钟

B2143 进制转换 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述

用递归算法将一个十进制数 XX 转换成任意进制数 MMM16M\le16)。

输入格式

一行两个数,第一个十进制数 XX,第二个为进制 MM

输出格式

输出结果。

样例 #1

样例输入 #1

31 16

样例输出 #1

1F

提示

样例解释

将十进制 3131 转化为十六进制数。

题解

思路

题目要实现任意进制的转换,我们应该回到进制转换的基本思路,研究输入的数字在不同进制下的组成,比如题目中所给的将十进制 3131 转化为十六进制数,直观上可以看出 3131 是由 111616151511 组成的。因此,我们在转换时,可以考虑采用递归,通过除法和取余对数字进行转换。

代码

#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';

得到结果为 114114

再来看一道类似的题目

描述

输入一个整数,将其转换成八进制数输出。

输入描述:

输入包括一个整数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 提供了一些操纵符,这些操纵符可以用于修改输出流的一些属性或执行一些特殊的操作。这里列出一些常用的操纵符:

  1. std::endl:用于插入一个换行符并刷新输出缓冲区。相当于 '\n'

    std::cout << "Hello" << std::endl;
    
  2. std::setw:设置域宽(字段宽度),用于控制下一个输出项的宽度。

    #include <iomanip>
    // ...
    std::cout << std::setw(5) << 42;  // 输出宽度为5的整数,不足的部分用空格填充
    
  3. std::setprecision:设置输出流的精度,用于控制浮点数的小数位数。

    #include <iomanip>
    // ...
    std::cout << std::setprecision(2) << 3.14159;  // 输出浮点数,保留两位小数
    
  4. std::fixed:以固定点表示法输出浮点数,保留小数点后的位数。

    #include <iomanip>
    // ...
    std::cout << std::fixed << 3.14159;  // 输出浮点数,保留小数点后所有位数
    
  5. std::scientific:以科学计数法表示浮点数。

    #include <iomanip>
    // ...
    std::cout << std::scientific << 3000.0;  // 输出浮点数,以科学计数法表示
    
  6. std::boolalpha:以文字形式而非数字形式输出布尔值。

    std::cout << std::boolalpha << true;  // 输出 "true" 而不是 "1"
    
  7. std::hexstd::octstd::dec:分别以十六进制、八进制、十进制输出整数。

    std::cout << std::hex << 255;  // 输出十六进制数
    
  8. std::showbase:显示整数的进制前缀(如 0x 表示十六进制)。

    std::cout << std::showbase << std::hex << 255;  // 输出 "0xFF"