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

相关推荐
课堂剪切板几秒前
ch07 题解
算法·深度优先
June bug6 分钟前
【Python基础】变量、运算与内存管理全解析
开发语言·python·职场和发展·测试
醇醛酸醚酮酯6 分钟前
Qt项目锻炼——TODO(五)
开发语言·qt
R_AirMan18 分钟前
深入浅出Redis:一文掌握Redis底层数据结构与实现原理
java·数据结构·数据库·redis
蹦蹦跳跳真可爱58926 分钟前
Python----OpenCV(几何变换--图像平移、图像旋转、放射变换、图像缩放、透视变换)
开发语言·人工智能·python·opencv·计算机视觉
骁的小小站30 分钟前
HDLBits刷题笔记和一些拓展知识(十一)
开发语言·经验分享·笔记·其他·fpga开发
ChuHsiang32 分钟前
【C语言学习】实现游戏——三子棋
c语言
Jtti32 分钟前
如何准确查看服务器网络的利用率?
开发语言·php
人生在勤,不索何获-白大侠37 分钟前
day17——Java集合进阶(Collections、Map)
java·开发语言
程序员小羊!1 小时前
Java教程:JavaWeb ---MySQL高级
java·开发语言·mysql