大数的任意进制之间的转换(九度OJ题目1080)
2016-09-11 11:30
507 查看
题目描述:
将M进制的数X转换为N进制的数输出。
输入:
输入的第一行包括两个整数:M和N(2<=M,N<=36)。
下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。
输出:
输出X的N进制表示的数。
样例输入:
样例输出:
提示:
输入时字母部分为大写,输出时为小写,并且有大数据。
#include<iostream>
#include<string>
using namespace std;
inline int convertFromChar(char ch);
inline char convertToChar(int num);
bool isZero(int * num, int len);
int main()
{
int M, N;
string numFrom;
int *fromM, *toN; //M进制和N进制的大数数组
while(cin >> M >> N)
{
cin >> numFrom;
int LEN = numFrom.size();
fromM = new int[LEN];
toN = new int[6 * LEN];
for(int i = 0; i < LEN; i++)
fromM[i] = convertFromChar(numFrom.at(i));
for(int i = 0; i < 6 * LEN; i++)
toN[i] = 0;
//开始做除法和取余运算
int posTo = 0;
while(!isZero(fromM, LEN)) //模拟除法,当M进制的数不为零时,将其除以N的余数作为N进制的对应位,商作为下一轮的被除数
{
int before = 0;
for(int i = 0; i < LEN; i++)
{
int tmp = fromM[i] + M * before;
fromM[i] = tmp / N;
before = tmp % N;
}
toN[posTo++] = before;
}
//输出(注意toN数组是反序存储,高位在后,posTo记录N进制数的最高位的位置)
if(posTo > 0)//注意边界案例
for(int i = posTo - 1; i >= 0; i--)
cout << convertToChar(toN[i]);
else
cout << 0;
cout << endl;
delete[] fromM;
delete[] toN;
}
//system("pause");
return 0;
}
int convertFromChar(char ch)
{
if(ch <= '9' && ch >= '0')
return (int)(ch - '0');
else if(ch <= 'Z' && ch >= 'A')
return (int)(ch - 'A') + 10;
else if(ch <= 'z' && ch >= 'a')
return (int)(ch - 'a') + 10;
}
char convertToChar(int num)
{
if(num <= 9 && num >= 0)
return (char)(num + '0');
else
return (char)(num - 10 + 'a');
}
bool isZero(int *num, int len)
{
bool yes = true;
for(int i = 0; i < len; i++)
if(num[i])
yes = false;
return yes;
}算法关键就在模拟长除法的部分,比如在大数情况下,10进制数转化为3进制数的长除法:
参考:http://blog.csdn.net/jaster_wisdom/article/details/52107785
将M进制的数X转换为N进制的数输出。
输入:
输入的第一行包括两个整数:M和N(2<=M,N<=36)。
下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。
输出:
输出X的N进制表示的数。
样例输入:
16 10 F
样例输出:
15
提示:
输入时字母部分为大写,输出时为小写,并且有大数据。
#include<iostream>
#include<string>
using namespace std;
inline int convertFromChar(char ch);
inline char convertToChar(int num);
bool isZero(int * num, int len);
int main()
{
int M, N;
string numFrom;
int *fromM, *toN; //M进制和N进制的大数数组
while(cin >> M >> N)
{
cin >> numFrom;
int LEN = numFrom.size();
fromM = new int[LEN];
toN = new int[6 * LEN];
for(int i = 0; i < LEN; i++)
fromM[i] = convertFromChar(numFrom.at(i));
for(int i = 0; i < 6 * LEN; i++)
toN[i] = 0;
//开始做除法和取余运算
int posTo = 0;
while(!isZero(fromM, LEN)) //模拟除法,当M进制的数不为零时,将其除以N的余数作为N进制的对应位,商作为下一轮的被除数
{
int before = 0;
for(int i = 0; i < LEN; i++)
{
int tmp = fromM[i] + M * before;
fromM[i] = tmp / N;
before = tmp % N;
}
toN[posTo++] = before;
}
//输出(注意toN数组是反序存储,高位在后,posTo记录N进制数的最高位的位置)
if(posTo > 0)//注意边界案例
for(int i = posTo - 1; i >= 0; i--)
cout << convertToChar(toN[i]);
else
cout << 0;
cout << endl;
delete[] fromM;
delete[] toN;
}
//system("pause");
return 0;
}
int convertFromChar(char ch)
{
if(ch <= '9' && ch >= '0')
return (int)(ch - '0');
else if(ch <= 'Z' && ch >= 'A')
return (int)(ch - 'A') + 10;
else if(ch <= 'z' && ch >= 'a')
return (int)(ch - 'a') + 10;
}
char convertToChar(int num)
{
if(num <= 9 && num >= 0)
return (char)(num + '0');
else
return (char)(num - 10 + 'a');
}
bool isZero(int *num, int len)
{
bool yes = true;
for(int i = 0; i < len; i++)
if(num[i])
yes = false;
return yes;
}算法关键就在模拟长除法的部分,比如在大数情况下,10进制数转化为3进制数的长除法:
参考:http://blog.csdn.net/jaster_wisdom/article/details/52107785
相关文章推荐
- 九度 oj 题目1080:进制转换
- 【九度OJ】题目1080:进制转换 解题报告
- POJ 1220 (两种任意进制之间的转换(大数),java的BigInteger)
- 【九度OJ】题目1138:进制转换 解题报告
- 题目1080:进制转换(任意进制直接转换方法)
- C++实现——任意进制之间的转换
- 通用进制转换工具,可实现进制之间的任意转换
- 通用进制转换工具,可实现进制之间的任意转换
- 任意进制整数之间的相互转换(C++实现)
- 题目1080:进制转换
- 2-36之间的任意进制之间转换的代码
- oj题目回顾(1942)C语言习题5.19--进制转换
- Python 10进制与任意进制之间相互转换(最大为62进制)
- 【笔记】【C语言】任意进制之间的转换(支持小数部分)
- 九度OJ 题目1080:进制转换
- 【C语言】任意进制之间的转换(支持小数部分)
- Python实现任意进制之间的转换
- 【剑指Offer面试编程题】题目1508:把字符串转换成整数--九度OJ
- 九度OJ-题目1508:把字符串转换成整数
- 九度 oj 题目1208:10进制 VS 2进制