九度OJ 1080:进制转换 (进制转换)
- 题目描述:
-
将M进制的数X转换为N进制的数输出。
- 输入:
-
输入的第一行包括两个整数:M和N(2<=M,N<=36)。
下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。
- 输出:
-
输出X的N进制表示的数。
- 样例输入:
-
16 10 F
- 样例输出:
-
15
- 提示:
-
输入时字母部分为大写,输出时为小写,并且有大数据。
思路:
典型进制转换题,直接看代码就行。
需要做一个字符转数字的函数。
a-z分别代表10-35.
代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> #define M 1000 int iszero(char s[M], int n) { for (int i=0; i<n; i++) { if(s[i] != '0') return 0; } return 1; } int ctoi(char c) { if ('A' <= c) return c-'A'+10; else return c-'0'; } char itoc(int i) { if (10 <= i) return i-10+'A'; else return i+'0'; } int main(void) { int m, n, i, k, left, flag; char s1[M], s2[M]; int len1; while (scanf("%d%d%s", &m, &n, s1) != EOF) { len1 = strlen(s1); k = 0; flag = 0; if (s1[0] == '-') { s1[0] = '0'; flag = 1; } if (iszero(s1, strlen(s1))) { printf("0\n"); continue; } while (! iszero(s1, len1)) { left = 0; for (i=0; i<len1; i++) { int tmp = left*m+ctoi(s1[i]); left = tmp%n; s1[i] = itoc(tmp/n); } //printf("left=%d\n", left); s2[k++] = itoc(left); } s2[k] = '\0'; if (flag == 1) printf("-"); for (i=strlen(s2)-1; i>=0; i--) { if ('A' <= s2[i]) s2[i] += 'a'-'A'; printf("%c", s2[i]); } printf("\n"); } return 0; } /************************************************************** Problem: 1080 User: liangrx06 Language: C Result: Accepted Time:70 ms Memory:912 kb ****************************************************************/
编程算法爱好者。