题目1080:进制转换
- 题目描述:
-
将M进制的数X转换为N进制的数输出。
- 输入:
-
输入的第一行包括两个整数:M和N(2<=M,N<=36)。
下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。
- 输出:
-
输出X的N进制表示的数。
- 样例输入:
-
16 10 F
- 样例输出:
-
15
- 提示:
-
输入时字母部分为大写,输出时为小写,并且有大数据。
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 #define LEN 2000 6 7 char str[LEN], another[LEN]; 8 int ten[LEN]; 9 10 int switchToTen(); 11 void switchToAnother(int k, int n); 12 13 int main() 14 { 15 int m, n, k; 16 17 while (scanf("%d %d", &m, &n) != EOF) { 18 scanf("%s", str); 19 20 k = switchToTen(m); 21 22 switchToAnother(k, n); 23 } 24 25 return 0; 26 } 27 28 int switchToTen(int m) 29 { 30 int i, j, len, k, c; 31 32 //初始化 33 len = strlen(str); 34 k = 1; 35 memset(ten, 0, sizeof(ten)); 36 37 //转换为10进制数 38 for (i = 0; i < len; i ++) { 39 for (j = 0; j < k; j ++) { 40 ten[j] *= m; 41 } 42 if (str[i] >= '0' && str[i] <= '9') { 43 ten[0] += str[i] - '0'; 44 }else if (str[i] >= 'A' && str[i] <= 'Z') { 45 ten[0] += str[i] - 'A' + 10; 46 }else if (str[i] >= 'a' && str[i] <= 'z') { 47 ten[0] += str[i] - 'a' + 10; 48 } 49 50 for (j = c = 0; j < k; j ++) { 51 ten[j] += c; 52 53 if (ten[j] >= 10) { 54 c = ten[j] / 10; 55 ten[j] %= 10; 56 }else { 57 c = 0; 58 } 59 } 60 61 while (c) { 62 ten[k ++] = c % 10; 63 c /= 10; 64 } 65 } 66 67 68 //翻转数组 69 int temp; 70 for (i = 0, j = k - 1; i < j; i ++, j --) { 71 temp = ten[i]; 72 ten[i] = ten[j]; 73 ten[j] = temp; 74 } 75 return k; 76 } 77 78 void switchToAnother(int k, int n) 79 { 80 int sum, i, r, t, d; 81 82 sum = 1; 83 r = 0; 84 memset(another, 0, sizeof(another)); 85 86 while (sum) { 87 sum = 0; 88 89 for (i = 0; i < k; i ++) { 90 d = ten[i] / n; 91 sum += d; 92 93 if (i == k - 1) { 94 t = ten[i] % n; 95 if (t >= 0 && t <= 9) { 96 another[r] = t + '0'; 97 }else { 98 another[r] = t - 10 + 'a'; 99 } 100 r ++; 101 }else { 102 ten[i + 1] += ten[i] % n * 10; 103 } 104 105 ten[i] = d; 106 } 107 } 108 109 for (i = r - 1; i >= 0; i --) { 110 printf("%c", another[i]); 111 } 112 printf("\n"); 113 }