九度OJ 1118:数制转换 (进制转换)
- 题目描述:
-
求任意两个不同进制非负整数的转换(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
- 提示:
-
可以用字符串表示不同进制的整数。
代码:
#include <stdio.h> #include <string.h> #define N 12 int char2int(char c) { if (c >= '0' && c <= '9') return (c - 48); else { switch (c) { case 'a': case 'A': return 10; break; case 'b': case 'B': return 11; break; case 'c': case 'C': return 12; break; case 'd': case 'D': return 13; break; case 'e': case 'E': return 14; break; case 'f': case 'F': return 15; break; default: return 0; } } } char int2char(int i) { if (i >= 0 && i <= 9) return (i + 48); else { switch (i) { case 10: return 'A'; break; case 11: return 'B'; break; case 12: return 'C'; break; case 13: return 'D'; break; case 14: return 'E'; break; case 15: return 'F'; break; default: return '0'; } } } int main(void) { int a, b, n; char na[N], nb[N]; int i; while (scanf("%d%s%d", &a, na, &b) != EOF) { n = 0; for (i=0; i<strlen(na); ++i) n = n*a + char2int(na[i]); i = 0; do { nb[i] = int2char(n%b); i++; n = n/b; }while (n>0); nb[i] = '\0'; for (i=strlen(nb)-1; i>=0; --i) printf("%c", nb[i]); printf("\n"); } return 0; } /************************************************************** Problem: 1118 User: liangrx06 Language: C Result: Accepted Time:10 ms Memory:912 kb ****************************************************************/
编程算法爱好者。