1942: 数制转换
Time Limit: 1 Sec Memory Limit: 32 MBSubmit: 2738 Solved: 693
[Submit][Status][Web Board][Creator:Imported]
Description
求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。
不同进制的表示符号为(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F)。
Input
输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。a,b是十进制整数,2 =< a,b <= 16。
Output
可能有多组测试数据,对于每组数据,输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,...,9,A,B,...,F)。
Sample Input
4 123 10
Sample Output
27
HINT
用字符串存储和表示不同进制的数。
1 #include <stdio.h> 2 #include <string.h> 3 4 int main(){ 5 int a, b; 6 char s[40]; 7 while(scanf("%d %s %d", &a, s, &b) != EOF){ 8 int len = strlen(s); 9 //将字符串转换成数值!!! 10 for(int i=0; i<len; i++){ 11 if(s[i]>='0' && s[i]<='9') s[i] = s[i] - '0'; 12 if(s[i]>='a' && s[i]<='f') s[i] = s[i] - 'a' + 10; 13 if(s[i]>='A' && s[i]<='F') s[i] = s[i] - 'A' + 10; 14 } 15 int sum=0, product=1; 16 for(int i=len-1; i>=0; i--) { 17 sum = sum + (int)s[i] * product; 18 product = product * a; 19 } 20 int num = 0; 21 //初始化!!! 22 memset(s, 0, sizeof(s)); 23 if(b==10){ 24 printf("%d ", sum); 25 }else{ 26 //很奇妙的转化方式!!! 27 do{ 28 if(sum%b<10){ 29 s[num++] = sum % b + '0'; 30 }else{ 31 s[num++] = sum % b - 10 + 'A'; 32 } 33 sum /= b; 34 }while(sum!=0); 35 for(int i=num-1; i>=0; i--){ 36 printf("%c", s[i]); 37 } 38 printf(" "); 39 } 40 } 41 return 0; 42 }