王道のコンピュータの機械は練習を試みます——高精度の大きい整数は随意に進数して換算します
26454 ワード
王道のコンピュータの機械は練習を試みます——高精度の大きい整数は随意に進数して換算します
タイトルの説明
M進の数XをN進の数出力に変換します.入力:入力された最初の行は、MとN(2<=M、N<=36)の2つの整数を含む.次の行には数Xを入力します.XはM進数です.M進数XをN進数出力に変換する必要があります.出力:XのN進表記の数を出力します.
テーマの考え方
この問題は最初は一般的な進数変換のように見えますが、入力には大きなデータがあることをヒントにしています.すなわち、この例に必要な進数変換を完了するためには、高精度整数を使用する必要があります.同時に、進数変換の内容を考慮して、私たちの高精度整数は以下の演算を行う必要があります:高精度整数と普通整数の積、高精度整数の間の和、高精度整数を普通整数で割って、高精度整数は普通整数に対して型などを求めます.
コード#コード#
タイトルの説明
M進の数XをN進の数出力に変換します.入力:入力された最初の行は、MとN(2<=M、N<=36)の2つの整数を含む.次の行には数Xを入力します.XはM進数です.M進数XをN進数出力に変換する必要があります.出力:XのN進表記の数を出力します.
テーマの考え方
この問題は最初は一般的な進数変換のように見えますが、入力には大きなデータがあることをヒントにしています.すなわち、この例に必要な進数変換を完了するためには、高精度整数を使用する必要があります.同時に、進数変換の内容を考慮して、私たちの高精度整数は以下の演算を行う必要があります:高精度整数と普通整数の積、高精度整数の間の和、高精度整数を普通整数で割って、高精度整数は普通整数に対して型などを求めます.
コード#コード#
#include
#include
#include
#define maxDigits 100
struct bigInteger {//
int digit[maxDigits];
int size;
void init() {//
for (int i = 0; i < maxDigits; i++) digit[i] = 0;
size = 0;
}
void set(int x) {//
init();
do {
digit[size++] = x % 10000;
x /= 10000;
} while (x != 0);
}
void output() {//
for (int i = size - 1; i >= 0; i--) {
if (i != size - 1) printf("%04d", digit[i]);
else printf("%d", digit[i]);
}
printf("
");
}
bigInteger operator*(int x) const {//
bigInteger ret;
ret.init();
int carry = 0;
for (int i = 0; i < size; i++) {
int tmp = x * digit[i] + carry;
carry = tmp / 10000;
tmp %= 10000;
ret.digit[ret.size++] = tmp;
}
if (carry != 0) {
ret.digit[ret.size++] = carry;
}
return ret;
}
bigInteger operator +(const bigInteger& A)const {//
bigInteger ret;
ret.init();
int carry = 0;
for (int i = 0; i < A.size || i < size; i++) {
int tmp = A.digit[i] + digit[i] + carry;
carry = tmp / 10000;
tmp %= 10000;
ret.digit[ret.size++] = tmp;
}
if (carry != 0) {
ret.digit[ret.size++] = carry;
}
return ret;
}
bigInteger operator /(int x)const {//
bigInteger ret;//
ret.init();
int remainder = 0;//
for (int i = size - 1; i >= 0; i--) {//
int t = (remainder * 10000 + digit[i]) / x;// x
int r = (remainder * 10000 + digit[i]) % x;//
ret.digit[i] = t;
remainder = r;
}
ret.size = 0;
for (int i = 0; i < maxDigits; i++) {
if (digit[i] != 0)ret.size = i;
}// ,
ret.size++;
return ret;
}
int operator %(int x)const {//
int remainder = 0;
for (int i = size - 1; i >= 0; i--) {
int t = (remainder * 10000 + digit[i]) / x;
int r = (remainder * 10000 + digit[i]) / x;
remainder = r;
}
return remainder;//
}
}a,b,c;
char str[10000];
char ans[10000];
int main() {
int n, m;
while (scanf("%d%d", &m, &n) != EOF) {
scanf("%s",str);// m
int L = strlen(str);
a.set(0);
b.set(1);
for (int i = L - 1; i >= 0; i--) {// m
int t = 0;
if (str[i] >= '0' && str[i] <= '9') {
t = str[i] - '0';
}
else {
t = str[i] - 'A' + 10;//
}
a = a + b * t;
b = b * m;
}
int size = 0;
do {// n
int t = a % n;//
if (t >= 10)ans[size++] = t - 10 + 'a';
else ans[size++] = t + '0';//
a =a/n;
} while (a.digit[0] != 0 || a.size != 1);
for (int i = size - 1; i >= 0; i--) printf("%c", ans[i]);
printf("
");
}
return 0;
}