当前位置: 首页 > news >正文

P1017 [NOIP 2000 提高组] 进制转换

题目描述

我们可以用这样的方式来表示一个十进制数:将每个阿拉伯数字乘以一个以该数字所处位置为指数,以101010为底数的幂之和的形式。例如123123123可表示为1×102+2×101+3×1001 \times 10^2+2\times 10^1+3\times 10^01×102+2×101+3×100这样的形式。

与之相似的,对二进制数来说,也可表示成每个二进制数码乘以一个以该数字所处位置为指数,以222为底数的幂之和的形式。

一般说来,任何一个正整数RRR或一个负整数−R-RR都可以被选来作为一个数制系统的基数。如果是以RRR−R-RR为基数,则需要用到的数码为0,1,…,R−10,1,\dots,R-10,1,,R1

例如当R=7R=7R=7时,所需用到的数码是0,1,2,3,4,5,60,1,2,3,4,5,60,1,2,3,4,5,6,这与其是RRR−R-RR无关。如果作为基数的数绝对值超过101010,则为了表示这些数码,通常使用英文字母来表示那些大于999的数码。例如对161616进制数来说,用AAA表示101010,用BBB表示111111,用CCC表示121212,以此类推。

在负进制数中是用 $-R $ 作为基数,例如−15-1515(十进制)相当于(110001)−2(110001)_{-2}(110001)2−2-22进制),并且它可以被表示为222的幂级数的和数:

(110001)−2=1×(−2)5+1×(−2)4+0×(−2)3+0×(−2)2+0×(−2)1+1×(−2)0(110001)_{-2}=1\times (-2)^5+1\times (-2)^4+0\times (-2)^3+0\times (-2)^2+0\times (-2)^1 +1\times (-2)^0(110001)2=1×(2)5+1×(2)4+0×(2)3+0×(2)2+0×(2)1+1×(2)0

设计一个程序,读入一个十进制数和一个负进制数的基数,并将此十进制数转换为此负进制下的数。

输入格式

输入的每行有两个输入数据。

第一个是十进制数nnn。第二个是负进制数的基数RRR

输出格式

输出此负进制数及其基数,若此基数的绝对值超过101010,则参照161616进制的方式处理。

输入输出样例 #1

输入 #1

30000 -2

输出 #1

30000=11011010101110000(base-2)

输入输出样例 #2

输入 #2

-20000 -2

输出 #2

-20000=1111011000100000(base-2)

输入输出样例 #3

输入 #3

28800 -16

输出 #3

28800=19180(base-16)

输入输出样例 #4

输入 #4

-25000 -16

输出 #4

-25000=7FB8(base-16)

说明/提示

数据范围

对于100%100\%100%的数据,−20≤R≤−2-20 \le R \le -220R2∣n∣≤37336|n| \le 37336n37336

题目解析

代码功能

将十进制整数n转换为r进制数(r可以是负数)

核心思路

1.递归转换函数zhuan(n, r)

voidzhuan(intn,intr){if(n==0)return;// 递归终止条件intm=n%r;// 取余数if(m<0)m-=r,n+=r;// 处理负数取余的问题if(m>=10)m='A'+m-10;// 将10以上的余数转为A-Felsem+='0';// 将0-9转为字符zhuan(n/r,r);// 递归处理高位printf("%c",m);// 输出当前位return;}

2.关键处理:负数取余修正

if(m<0)m-=r,n+=r;

这是最巧妙的部分!为什么需要这个?

  • 在C++中,负数取余结果可能是负数(如:-5 % 2 = -1)
  • 但在进制转换中,余数应该始终为非负数
  • 通过m-=r将负余数转为正数,同时n+=r调整被除数

3.执行示例

n=10, r=2为例:

zhuan(10,2): m=0 → '0' zhuan(5,2): m=1 → '1' zhuan(2,2): m=0 → '0' zhuan(1,2): m=1 → '1' zhuan(0,2): return 输出'1' 输出'0' 输出'1' 输出'0' 结果:1010(base2)

4.主函数流程

intmain(){intn,r;cin>>n>>r;// 输入数字和进制cout<<n<<"=";// 输出格式zhuan(n,r);// 递归转换printf("(base%d)",r);// 输出进制return0;}

算法特点

  1. 递归实现:从低位到高位处理,但输出时从高位到低位
  2. 处理负进制:支持r为负数的情况
  3. 字符处理:10-15转为’A’-‘F’
  4. 格式规范:输出如 “10=1010(base2)” 的标准格式

【贴上代码~】

#include<iostream>#include<cstdio>#include<cmath>#include<cstring>usingnamespacestd;voidzhuan(intn,intr){if(n==0)return;intm=n%r;if(m<0)m-=r,n+=r;if(m>=10)m='A'+m-10;elsem+='0';zhuan(n/r,r);printf("%c",m);return;}intmain(){intn,r;string ans="";cin>>n>>r;cout<<n<<"=";zhuan(n,r);printf("(base%d)",r);return0;//完结撒花}
http://www.jsqmd.com/news/453563/

相关文章:

  • css学习笔记
  • 【宠物领养系统】~Python+Vue3+管理系统网站+2026原创
  • GIMP中文版下载安装指南:不花钱的专业修图软件(2026最新版)
  • 物联网技术综合实训教程【2.0】
  • Ostrakon-VL-8B赋能Web应用:打造智能图片内容审核前端
  • 养龙虾-------【多openclaw 对接飞书多应用】---多个大龙虾机器人群聊
  • 探讨2026年有特色的家电展会,大型家电展会好用的有哪些 - 工业推荐榜
  • 率零和嘎嘎降AI哪个好?穷学生实测对比告诉你
  • 2026私域风口下微信小程序商城开发服务商推荐深度解析
  • ASP 总结
  • C/C++ 二维平面求点到直线的距离
  • 2026宁波高端红茶批发指南:口碑厂家,养生必备,有机认证高端红茶/生态红茶/特色高端精品红茶,高端红茶加工厂选哪家 - 品牌推荐师
  • 生产环境日志分析:用NLP-StructBERT聚类相似错误日志
  • StructBERT零样本分类-中文-base实际作品集:电商评论‘好评/中评/差评/物流问题’四分类效果
  • 2026年Kimi写的论文AI率太高?这几款降AIGC率工具实测有效
  • 封神博弈入门✅蒋文华《博弈论基础及其应用》,浙大出版社出品,解锁人生决策密码
  • 2026年常州干燥机设备正规厂商排名,十大厂家有哪些 - mypinpai
  • 手把手教你用 cephadm 在 Ubuntu 22.04 上部署生产级 Ceph 集群(Quincy/Reef 版本通用)
  • Qwen3-0.6B-FP8应用开发:Python源码分析工具
  • 天津普通装修哪家公司口碑好?2026最新FAQ解答 - 速递信息
  • C 语言测验
  • AI智能体在设备预测性维护的场景应用|从被动抢修到主动预测,构建智能工厂新范式
  • 2026年太原清水混凝土装饰公司口碑排名,有实力的品牌企业汇总 - 工业品牌热点
  • 提升开发效率:coze-loop AI代码优化器从入门到精通实战
  • 多无人机动态避障路径优化:基于阿尔法进化(Alpha Evolution,AE)算法的多个无人机动态避障路径规划(MATLAB代码
  • 2026年盘点贵阳老牌的新能源汽修培训,口碑好的是哪家 - 工业品网
  • Allegro PCB整体旋转
  • call间接调用
  • PAT 乙级 1111
  • 亲测推荐:氢气压缩机厂家实战案例