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; }
完