http://ac.jobdu.com/problem.php?pid=1080
-
题目描述:
-
将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>
#include <iostream>
#include <fstream>
using namespace std;
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; //有问题啊,不是10吗?????????
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;
ifstream cin("data.txt");
while (cin >> M >> N)
{
char buf[10000], res[10000];
int top = 0;
cin >> 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') //输入数据前有可能有前缀0,这里要去掉前缀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--)
cout << res[i];
}
cout << endl;
}
system("pause");
return 0;
}