P1143 进制转换
P1143 进制转换
分类:数论,进制
1.题目描述
请你编一程序实现两种不同进制之间的数据转换。
输入格式
共三行,第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16),第二行是一个n进制数,若n>10则用大写字母A-F表示数码10-15,并且该n进制数对应的十进制的值不超过1000000000,第三行也是一个正整数,表示转换之后的数的进制m(2≤m≤16)。
输出格式
一个正整数,表示转换之后的m进制数。
输入输出样例
输入
16FF2
输出
11111111
样例说明
16进制下的FF转成2进制是11111111
2.所含知识点
进制转换
进制也就是进位计数制,是人为定义的带进位的计数方法。 对于任何一种进制---X进制,就表示每一位置上的数运算时都是逢X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。
1.n进制转十进制
例如:
二进制下的10010为十进制下的18
那,这是怎么转换的呢?
按 权 展 开
方法为:把n进制数按权展开、相加即得十进制数。
一个n进制数个位上的权为n0,十位就是n1.......以此类推,最后相加就是十进制了
例如:8进制下的512,
算式为:(512)8=2*80+1*81+5*82
=2*1+1*8+5*64
=(330)10
2.十进制转n进制
例如
十进制下的18为2进制下的10010
方法:
短除法
短除法运算方法是先用一个除数除以能被它除尽的一个质数,以此类推,除到商是0或者质数为止。
短除法常被应用在求最大公因数以及最小公倍数上
n即为短除法中的除数
直到商是0,则倒取余数
n进制转m进制的过程就是先转成十进制
3.代码
由于参与>10进制的进制,所以我们分两步讨论
另外,为了能够输入字符串,用到了string
#include <iostream> #include <cstdio>
#include <string> using namespace std; int main(){ int n; long long m; string s; cin>>n>>s>>m; /* 思路:先转十进制,再转m进制 n进制转十进制思路: 位权相加 十进制转m进制思路:短除法倒取余数 */ long long sum1=0; int x=1; if(n!=10){ for(int i=s.length()-1;i>=0;i--){ if(s[i]<='9'){ sum1=sum1+((s[i]-'0')*x); } else{ sum1+=(int(s[i]-'A')+10)*x; } x*=n; } }else if(n==10) { //十进制转十进制 for(int i=s.length()-1;i>=0;i--){ sum1=sum1+((s[i]-'0')*x); x*=n; } } //第二步,由10进制转m进制 //m<11 string sum2; int shang=sum1,yv,i=0; if(m<11){ while(shang!=0){ yv=shang%m; sum2[i]=yv+'0'; shang/=m; i++; } sum2[i]='0'; for(int j=i-1;j>=0;j--){ cout<<sum2[j]; } }else{ while(shang!=0){ yv=shang%m; if(yv<=9){ sum2[i]=yv+'0'; }else{ sum2[i]=yv-10+'A'; } shang/=m; i++; } sum2[i]='0'; for(int j=i-1;j>=0;j--){ cout<<sum2[j]; } } return 0; }
完
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现