数制转换(王道)

题目描述:  

    求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。  

    不同进制的表示符号为(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F)。  

输入:  

    输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。a,b是十进制整数,2 =< a,b <= 16。  

    数据可能存在包含前导零的情况。  

输出:  

    可能有多组测试数据,对于每组数据,输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,...,9,A,B,...,F)。  

样例输入:  

15 Aab3 7  

样例输出:  

210306 

 1 #include <iostream>
 2 #include<string.h>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int a,b;
 8     char str[40];
 9     memset(str,0,sizeof(str));
10     while(scanf("%d%s%d",&a,str,&b)!=EOF){
11         int len=strlen(str);
12         int temp=0;
13         int c=1;
14         for(int i=len-1;i>=0;i--){//转换成十进制
15             int x;
16             if(str[i]<='9'&&str[i]>='0'){
17                 x=str[i]-'0';
18             }
19             else if(str[i]>='a' && str[i]<='f'){
20                 x=str[i]-'a'+10;
21             }
22             else if(str[i]>='A' && str[i]<='F'){
23                 x=str[i]-'A'+10;
24             }
25             temp+=x*c;//累加该位数字和数位权重的积
26             c*=a;//计算下一位数位权重
27         }
28         char ans[40];
29         memset(ans,0,sizeof(ans));
30         int size=0;
31         while(temp){
32             int x=temp%b;//计算该位数字
33             char x0;
34             if(x<10)//转换成字符
35                 x0=x+'0';
36             else
37                 x0=x+'a'-10;
38             ans[size++]=x0;
39             temp/=b;
40         }
41         for(int i=size-1;i>=0;i--){
42             printf("%c",ans[i]);
43         }
44         printf("\n");
45     }
46     return 0;
47 }

P.S.这个题实际上很简单,我做的一直报错的原因主要是因为很多初始化都没写。像里面的size,temp,c等都是应该初始化的,如果没有初始化是做不出来的。

 

posted @ 2018-03-25 12:03  Shaw_喆宇  阅读(267)  评论(0编辑  收藏  举报