【NOIP提高组】进制转换

【NOIP提高组】进制转换

|-----------------------------|
| 💖The Begin💖点点关注,收藏不迷路💖 |

我们可以用这样的方式来表示一个十进制数:将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以 10 为底数的幂之和的形式。

例如, 123 可表示为 1 × 10 ^2 + 2 × 10 ^1 + 3 × 10 ^0这样的形式。与之相似的,对二进制数来说,也可表示成每个二进制数码乘以一个以该数字所处位置的(值-1)为指数,以2为底数的幂之和的形式。一般说来,任何一个正整数R或一个负整数-R都可以被选来作为一个数制系统的基数。如果是以 𝑅 或 − 𝑅 为基数,则需要用到的数码为 0 , 1 , ⋯ 𝑅 − 1 。例如,当 𝑅 = 7 时,所需用到的数码是 0 , 1 , 2 , 3 , 4 , 5 和 6,这与其是 𝑅 或 − 𝑅 无关。如果作为基数的数绝对值超过 10 ,则为了表示这些数码,通常使用英文字母来表示那些大于 9 的数码。

例如对 16 进制数来说,用 𝐴 表示 10 ,用 𝐵表示 11 ,用 𝐶 表示 12 ,用 𝐷 表示 13 ,用 𝐸 表示 14 ,用 𝐹 表示 15 。在负进制数中是用 − 𝑅 作为基数,例如 − 15 (+进制)相当于 110001 ( −2进制),并且它可以被表示为 2 的幂级数的和数: 110001 = 1 × ( − 2 ) ^5 + 1 × ( − 2 ) ^4 + 0 × ( − 2 ) ^3 + 0 × ( − 2 ) ^2 + 0 × ( − 2 ) ^1 + 1 × ( − 2 ) ^0 。

问题求解: 设计一个程序,读入一个十进制数的基数和一个负进制数的基数,并将此十进制数转换为此负进制下的数: − 𝑅 ∈ { 2 , − 3 , − 4 , − 20 }

输入:

输入的每行有两个输入数据。 第一个是十进制数 𝑁 ( − 32768 ≤ 𝑁 ≤ 32767 ) N(−32768≤N≤32767);第二个是负进制数的基数 −R。输入的每行有两个输入数据。 第一个是十进制数 𝑁 ( − 32768 ≤ 𝑁 ≤ 32767 ) N(−32768≤N≤32767);第二个是负进制数的基数 −R。

输出:

结果显示在屏幕上,相对于输入,应输出此负进制数及其基数,若此基数超过10,则参照16进制的方式处理。

样例输入:

java 复制代码
30000 -2
-20000 -7
28800 -16
-25000 -16

样例输出:

java 复制代码
30000=1101101010111000(base-2)
-20000=1111011000100000(base-2)
28800=19180(base-16)
-25000=7FB8(base-16)

提示:

每个测试数据不超过1000组。不要单纯地用普通进制转换的方法。

java 复制代码
#include <stdio.h>

char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// 定义一个包含数字字符的数组

int result[1000000];
// 定义一个用于存储结果的整型数组

int main() {
    int number, base;
    // 声明两个整型变量number和base

    while (scanf("%d%d", &number, &base) == 2) {
        // 循环接收输入的number和base,直到输入不符合要求(非整数)

        int index = 0;
        // 声明一个整型变量index并初始化为0,用于记录当前位置

        printf("%d=", number);
        // 输出当前的number值

        while (number != 0) {
            // 当number不为0时执行循环

            int remainder = number % base;
            // 计算number除以base的余数

            if (remainder < 0)
                remainder -= base;
            // 如果余数为负数,则调整为正数

            result[1000000 - index - 1] = remainder;
            // 将余数存入result数组中,从右向左存储

            number = (number - remainder) / base;
            // 更新number的值为(number - remainder) / base

            index++;
            // index自增1,表示位置向左移动一位
        }

        for (int i = index - 1; i >= 0; i--) {
            // 从高位到低位遍历result数组

            printf("%c", digits[result[1000000 - i - 1]]);
            // 输出对应余数所代表的字符

        }

        printf("(base%d)\n", base);
        // 输出所转换的进制
    }

    return 0;
    // 返回运行成功
}

通过不断地对number取模得到余数,并将余数转换为对应的字符,最终输出转换后的结果。同时处理了负数取模时的特殊情况。

  1. 从用户输入获取要转换的十进制数(number)和目标进制(base)。
  2. 使用循环,重复执行以下步骤直到 number 为 0:
    • 计算 number 除以 base 的余数(remainder),并将余数存储在结果数组中。
    • 如果余数为负数,则将其调整为正数。
    • 更新 number 的值为 (number - remainder) / base。
  3. 遍历结果数组,将每个余数转换为对应的字符。
  4. 按正确的顺序输出转换后的字符,即可得到目标进制下的表示。

|---------------------------|
| 💖The End💖点点关注,收藏不迷路💖 |

相关推荐
微风中的麦穗6 小时前
【MATLAB】MATLAB R2025a 详细下载安装图文指南:下一代科学计算与工程仿真平台
开发语言·matlab·开发工具·工程仿真·matlab r2025a·matlab r2025·科学计算与工程仿真
2601_949146536 小时前
C语言语音通知API示例代码:基于标准C的语音接口开发与底层调用实践
c语言·开发语言
开源技术6 小时前
Python Pillow 优化,打开和保存速度最快提高14倍
开发语言·python·pillow
学嵌入式的小杨同学6 小时前
从零打造 Linux 终端 MP3 播放器!用 C 语言实现音乐自由
linux·c语言·开发语言·前端·vscode·ci/cd·vim
wfeqhfxz25887826 小时前
YOLO13-C3k2-GhostDynamicConv烟雾检测算法实现与优化
人工智能·算法·计算机视觉
Aaron15887 小时前
基于RFSOC的数字射频存储技术应用分析
c语言·人工智能·驱动开发·算法·fpga开发·硬件工程·信号处理
Queenie_Charlie7 小时前
前缀和的前缀和
数据结构·c++·树状数组
mftang8 小时前
Python 字符串拼接成字节详解
开发语言·python
爱编码的小八嘎8 小时前
C语言对话-21.模板特化,缺省参数和其他一些有趣的事情
c语言
jasligea8 小时前
构建个人智能助手
开发语言·python·自然语言处理