【NOIP提高组】进制转换

2024-06-02 11:44
文章标签 转换 提高 进制 noip

本文主要是介绍【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进制的方式处理。

样例输入:

30000 -2
-20000 -7
28800 -16
-25000 -16

样例输出:

30000=1101101010111000(base-2)
-20000=1111011000100000(base-2)
28800=19180(base-16)
-25000=7FB8(base-16)

提示:

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

#include <stdio.h>char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// 定义一个包含数字字符的数组int result[1000000];
// 定义一个用于存储结果的整型数组int main() {int number, base;// 声明两个整型变量number和basewhile (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) / baseindex++;// 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💖点点关注,收藏不迷路💖

这篇关于【NOIP提高组】进制转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1023871

相关文章

usaco 1.2 Palindromic Squares(进制转化)

考察进制转化 注意一些细节就可以了 直接上代码: /*ID: who jayLANG: C++TASK: palsquare*/#include<stdio.h>int x[20],xlen,y[20],ylen,B;void change(int n){int m;m=n;xlen=0;while(m){x[++xlen]=m%B;m/=B;}m=n*n;ylen=0;whi

uva 10061 How many zero's and how many digits ?(不同进制阶乘末尾几个0)+poj 1401

题意是求在base进制下的 n!的结果有几位数,末尾有几个0。 想起刚开始的时候做的一道10进制下的n阶乘末尾有几个零,以及之前有做过的一道n阶乘的位数。 当时都是在10进制下的。 10进制下的做法是: 1. n阶位数:直接 lg(n!)就是得数的位数。 2. n阶末尾0的个数:由于2 * 5 将会在得数中以0的形式存在,所以计算2或者计算5,由于因子中出现5必然出现2,所以直接一

键盘快捷键:提高工作效率与电脑操作的利器

键盘快捷键:提高工作效率与电脑操作的利器 在数字化时代,键盘快捷键成为了提高工作效率和优化电脑操作的重要工具。无论是日常办公、图像编辑、编程开发,还是游戏娱乐,掌握键盘快捷键都能带来极大的便利。本文将详细介绍键盘快捷键的概念、重要性、以及在不同应用场景中的具体应用。 什么是键盘快捷键? 键盘快捷键,也称为热键或快捷键,是指通过按下键盘上的一组键来完成特定命令或操作的方式。这些快捷键通常涉及同

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

如何提高 GitHub 的下载速度

如何提高 GitHub 的下载速度 文章目录 如何提高 GitHub 的下载速度1. 注册账号2. 准备好链接3. 创建仓库4. 在码云上下载代码5. 仓库更新了怎么办 一般来说,国内的朋友从 GitHub 上面下载代码,速度最大是 20KB/s,这种龟速,谁能忍受呢? 本文介绍一种方法——利用“码云”,可以大大提高下载速度,亲测有效。 1. 注册账号 去“码云”注册一

PDF 软件如何帮助您编辑、转换和保护文件。

如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案,还是尝试组织和编辑主文档,PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时,请考虑这些因素。 1. 确定您的 PDF 文档软件需求。 不同的 PDF 文档软件程序可以具有不同的功能,因此在决定哪个是最适合您的 PDF 软件之前,请花点时间评估您的

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

数据流与Bitmap之间相互转换

把获得的数据流转换成一副图片(Bitmap) 其原理就是把获得倒的数据流序列化到内存中,然后经过加工,在把数据从内存中反序列化出来就行了。 难点就是在如何实现加工。因为Bitmap有一个专有的格式,我们常称这个格式为数据头。加工的过程就是要把这个数据头与我们之前获得的数据流合并起来。(也就是要把这个头加入到我们之前获得的数据流的前面)      那么这个头是

高斯平面直角坐标讲解,以及地理坐标转换高斯平面直角坐标

高斯平面直角坐标系(Gauss-Krüger 坐标系)是基于 高斯-克吕格投影 的一种常见的平面坐标系统,主要用于地理信息系统 (GIS)、测绘和工程等领域。该坐标系将地球表面的经纬度(地理坐标)通过一种投影方式转换为平面直角坐标,以便在二维平面中进行距离、面积和角度的计算。 一 投影原理 高斯平面直角坐标系使用的是 高斯-克吕格投影(Gauss-Krüger Projection),这是 横

Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(4)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(3)-CSDN博客  这节就是真正的存储数据了   理清一下思路: 1.存储路径并检查 //2进制文件类存储private static string Data_Binary_Pa