- 題目描述:
-
將M進制的數X轉換爲N進制的數輸出。
- 輸入:
-
輸入的第一行包括兩個整數:M和N(2<=M,N<=36)。
下面的一行輸入一個數X,X是M進制的數,現在要求你將M進制的數X轉換成N進制的數輸出。
- 輸出:
-
輸出X的N進製表示的數。
- 樣例輸入:
-
16 10 F
- 樣例輸出:
-
15
- 提示:
-
輸入時字母部分爲大寫,輸出時爲小寫,並且有大數據。
-
-
/*********************************************** 輸入數據前有可能有前綴0,比如0000087654321 另外也要注意對0的處理 *************************************************/ #include <stdio.h> #include <string.h> struct bigInt { int digit[300]; int size; }; void init(bigInt &a) { for(int i = 0; i < 300; i++) a.digit[i] = 0; a.size = 0; } bigInt add(bigInt a, bigInt b) //高精度整數加法 { bigInt ret; init(ret); int bound = a.size > b.size ? a.size : b.size; int carry = 0; for(int i = 0; i < bound; i++) { int tmp = a.digit[i] + b.digit[i] + carry; carry = tmp / 10000; ret.digit[ret.size++] = tmp % 10000; } if(carry != 0) ret.digit[ret.size++] = carry; return ret; } bigInt mul(bigInt a, int x) // 高精度整數乘小整數 { bigInt ret; init(ret); int carry = 0; for(int i = 0; i < a.size; i++) { int tmp = a.digit[i] * x + carry; ret.digit[ret.size++] = tmp % 10000; carry = tmp / 10000; } if(carry != 0) ret.digit[ret.size++] = carry; return ret; } bigInt divide(bigInt a, int x) // 高精度整數除以小整數 { bigInt ret; init(ret); int remainder = 0; for(int i = a.size - 1; i >= 0; i--) { int tmp = a.digit[i] + remainder * 10000; ret.digit[i] = tmp / x; remainder = tmp % x; } ret.size = 0; for(int j = 0; j < 300; j++) if(ret.digit[j] != 0) ret.size = j; ret.size++; return ret; } int mod(bigInt a, int x) // 高精度整數對小整數取模 { int remainder = 0; for(int i = a.size - 1; i >= 0; i--) { int tmp = a.digit[i] + remainder * 10000; remainder = tmp % x; } return remainder; } int main() { int M, N; while(scanf("%d%d",&M,&N) != EOF) { char buf[10000], res[10000]; int top = 0; scanf("%s",buf); struct bigInt a, b, mid; init(a); init(b); init(mid); mid.digit[0] = 1; mid.size = 1; int len = strlen(buf); int i, tmp, min = 0; while(buf[min] == '0') min++; for(i = len-1; i >= min; i--) // M進制數轉爲十進制高精度整數 { if(buf[i] >= '0' && buf[i] <= '9') tmp = buf[i] - '0'; else tmp = buf[i] - 'A' + 10; b = mul(mid,tmp); a = add(a,b); mid = mul(mid,M); } if(a.digit[a.size-1] == 0) // 十進制高精度整數轉爲N進制字符串 printf("0"); else { int ans; while(a.digit[a.size-1] != 0) { ans = mod(a,N); if(ans >= 0 && ans <= 9) res[top++] = '0' + ans; else res[top++] = 'a' + ans - 10; a = divide(a,N); //printf("%c\n",res[top-1]); } for(i = top - 1; i >= 0; i--) printf("%c",res[i]); } printf("\n"); } return 0; }