AcWing 數的進位制轉化
阿新 • • 發佈:2020-12-30
主要用到一個高精度除法.
將一個數字(不管是什麼進位制)轉化為x進製表示,只需要不停地將該數字除以x直到結果為0,將所得的一系列餘數按原序排列在一起即得結果.因為:
例如將十進位制下12345轉化為4進位制,由於:
12345=3x46+0x45+0x44+0x43+3x42+2x41+1x40.
每當除以4,除最後一項外,4的指數都減一,最後一項即為餘數.
得3000321.
這個規律不論是從小的進位制到大的進位制還是反過來都是正確的.非10進位制的高精度除法只需要稍微修改一下.
#include <algorithm> #include <cmath> #include <cstdio> #includeAC Code<cstdlib> #include <cstring> #include <iostream> using namespace std; char A[1010]; int A_int[1010], ans[1010], idx; int t, from, to; int div1(int x, int l) { int tmp[1010]; A_int[0] = 0; for (int i = l; i >= 1; i--) { tmp[i] = A_int[i] / x; A_int[i - 1] += (A_int[i] % x) * from; } while (!tmp[l] && l) l--; for (int i = l; i >= 1; i--) A_int[i] = tmp[i]; return l; } int main() { scanf("%d", &t); while (t--) { scanf("%d%d%s", &from, &to, A); idx = 0; int len = strlen(A); for (int i = len - 1; i >= 0; i--) { // turn A to A_int if (A[i] >= '0' && A[i] <= '9') A_int[len - i] = A[i] - '0'; else if (A[i] >= 'A' && A[i] <= 'Z') A_int[len - i] = A[i] - 'A' + 10; else if (A[i] >= 'a' && A[i] <= 'z') A_int[len - i] = A[i] - 'a' + 36; } while (len = div1(to, len)) ans[++idx] = A_int[0] / from; ans[++idx] = A_int[0] / from; printf("%d %s\n%d ", from, A, to); for (int i = idx; i >= 1; i--) { if (ans[i] >= 0 && ans[i] < 10) printf("%d", ans[i]); else if (ans[i] >= 10 && ans[i] <= 35) printf("%c", ans[i] + 'A' - 10); else if (ans[i] >= 36 && ans[i] <= 61) printf("%c", ans[i] + 'a' - 36); } puts("\n"); } return 0; }
這是一道ICPC New York的真題.