王道のコンピュータの機械は練習を試みます——高精度の大きい整数は随意に進数して換算します


王道のコンピュータの機械は練習を試みます——高精度の大きい整数は随意に進数して換算します
タイトルの説明
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; }