【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💖点点关注,收藏不迷路💖 |

相关推荐
香饽饽~、38 分钟前
【第十一篇】SpringBoot缓存技术
java·开发语言·spring boot·后端·缓存·intellij-idea
Devil枫2 小时前
Kotlin扩展函数与属性
开发语言·python·kotlin
菠萝加点糖2 小时前
Kotlin Data包含ByteArray类型
android·开发语言·kotlin
2301_803554523 小时前
c++中类的前置声明
java·开发语言·c++
hn小菜鸡5 小时前
LeetCode 377.组合总和IV
数据结构·算法·leetcode
不想写bug呀6 小时前
多线程案例——单例模式
java·开发语言·单例模式
Deepoch6 小时前
Deepoc 大模型:无人机行业的智能变革引擎
人工智能·科技·算法·ai·动态规划·无人机
我不会写代码njdjnssj6 小时前
网络编程 TCP UDP
java·开发语言·jvm
李少兄9 天前
解决OSS存储桶未创建导致的XML错误
xml·开发语言·python
阿蒙Amon9 天前
《C#图解教程 第5版》深度推荐
开发语言·c#