- 题目描述:
-
求任意两个不同进制非负整数的转换(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
哎,越写越长...像老太太的裹脚布...不需要用map...一开始用的switch...其实直接判断余数>=10 就直接 num-10+'A' 就可以了..1 #include <stdio.h> 2 #include <cstring> 3 #include <cctype> 4 #include <cmath> 5 #include <algorithm> 6 #include <map> 7 using namespace std; 8 int main() 9 { 10 int i,a,b,ex,ctoi; 11 typedef map<char,int> char_int; 12 char_int kv; 13 kv['A']=10; 14 kv['B']=11; 15 kv['C']=12; 16 kv['D']=13; 17 kv['E']=14; 18 kv['F']=15; 19 char_int::iterator ikv; 20 char n[200],ans[200]; 21 //freopen("in.txt","r",stdin); 22 while (scanf("%d %s %d",&a,n,&b)!=EOF) 23 { 24 i=0; 25 int sum=0; 26 while (n[i]) 27 { 28 if (isalpha(n[i])) 29 n[i]=toupper(n[i]); 30 ++i; 31 } 32 ex=0; 33 --i; 34 while(i>=0) 35 { 36 char temp=n[i]; 37 if (temp>='0'&&temp<='9') 38 ctoi=temp-'0'; 39 else 40 ctoi=kv[temp]; 41 sum+=ctoi*pow(a,ex++); 42 --i; 43 } 44 if (sum==0) 45 { 46 printf("0\n"); 47 continue; 48 } 49 i=0; 50 while (sum>0) 51 { 52 ctoi=sum%b; 53 if (ctoi>=10) 54 { 55 for (ikv=kv.begin();ikv!=kv.end();++ikv) 56 { 57 if ((*ikv).second==ctoi){ 58 ans[i++]=(*ikv).first; 59 break; 60 } 61 } 62 } 63 else 64 ans[i++]=ctoi+'0'; 65 sum/=b; 66 } 67 std::reverse(ans,ans+i); 68 ans[i]=0; 69 printf("%s\n",ans); 70 } 71 return 0; 72 }