P1143 进制转换

P1143 进制转换

分类:数论,进制

1.题目描述

  请你编一程序实现两种不同进制之间的数据转换。

输入格式

  共三行,第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16),第二行是一个n进制数,若n>10则用大写字母A-F表示数码10-15,并且该n进制数对应的十进制的值不超过1000000000,第三行也是一个正整数,表示转换之后的数的进制m(2≤m≤16)

输出格式

  一个正整数,表示转换之后的m进制数。

输入输出样例

输入

16 
FF
2

输出

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





 

 

 
posted @ 2020-05-07 14:25  阿维斯托  阅读(593)  评论(0编辑  收藏  举报