/*
本程序的优势与特点:由于之前在网上看到金山公司的招聘上有一条N进制转换成M进制的题目,
于是我就下定决心要把它做出来。我利用了自己参加ACM比赛时学到的一些知识,运用了高精度
与基本进制转换的知识,原创了一个N进制转换成M进制的C++程序。它的功能比我在网上看到的
一些水货“万能进制转换”还要强大。当然,它也有自己的不足之处。源代码如下,有兴趣的
朋友,可以在如下代码的基础上进行优化与深入。
本程序解决的问题:把一个N进制的数(data)转换成M进制。
注:2 <= N, M <= 36;data长度不能超过10000位;
且仅当M = N^K(K是个正整数)时,data允许带小数部分,否则data只允许是个整数。
作者:Bennis
完成日期:2009年4月19日
*/
#define N 10000
#include <iostream>
using namespace std;
//子函数声明部分。
void input( int *, int *, char *, bool * );
int Multiplication( int, int *, int );
int Power( int *, int, int );
int Add( int *, int, int *, int );
int Calculate( int *, int, int, int * );
int ToDecimal( char *, int *, int, int );
void ToString( int *, int, char * );
int Division( int *, int, int, char * );
int Convertor( char *, char *, int, int, int );
int EasyConvertion( char *, int *, int, int, int, int );
void output( char *, char *, int, int, int, bool );
/*
函数功能描述:
主函数,程序的入口。
*/
int main()
{
bool positive = true;
char *inData = new char[N], *outData = new char[N * 6], length;
int n, m;
input( &n, &m, inData, &positive );
length = Convertor( inData, outData, strlen( inData ), n, m );
output( inData, outData, n, m, length, positive );
delete [] inData;
delete [] outData;
return 0;
}
/*
函数功能描述:
输入函数。
参数说明:
第一个参数表示N进制的N;
第二个参数表示M进制的M;
第三个参数data表示输入N进制的值;
第四人参数flat表示data是否为正数。
*/
void input( int *n, int *m, char *data, bool *flag )
{
cout << "Please input n, m and the data for n radix.( n and m both radixes. This program is work for convert data from n radix to m radix. )" << endl << "Please press 'Enter' key when you finish input a value." << endl;
do
{
char num[N] = { 0 };
cout << "Notice: 2 <= n, m <= 36. The length of data on more than 10000." << endl;
cout << "n = ";
cin >> num;
if( ( strlen( num ) < 1 ) || ( strlen( num ) > 2 ) )
{
if( ( num[0] < 48 ) || ( num[0] > 57 ) || ( num[1] < 48 ) || ( num[1] > 57 ) )
{
continue;
}
continue;
}
if( strlen( num ) > 1 )
{
*n = ( num[0] - 48 ) * 10 + num[1] - 48;
}
else
{
*n = num[0] - 48;
}
}while( ( *n < 2 ) || ( *n > 36 ) );
do
{
char num[N] = { 0 };
cout << "Notice: 2 <= n, m <= 36. The length of data on more than 10000." << endl;
cout << "m = ";
cin >> num;
if( ( strlen( num ) < 1 ) || ( strlen( num ) > 2 ) )
{
if( ( num[0] < 48 ) || ( num[0] > 57 ) || ( num[1] < 48 ) || ( num[1] > 57 ) )
{
continue;
}
continue;
}
if( strlen( num ) > 1 )
{
*m = ( num[0] - 48 ) * 10 + num[1] - 48;
}
else
{
*m = num[0] - 48;
}
}while( ( *m < 2 ) || ( *m > 36 ) );
do
{
bool tag = true;
int i = 1, t, min = *n < *m ? *n : *m, max = *n > *m ? *n : *m;
cout << "Notice: 2 <= n, m <= 36. The length of data on more than 10000." << endl;
cout << "data = ";
cin >> data;
if( data[0] == '-' )
{
*flag = false;
}
while( ( ( data[i] > 47) && ( data[i] < 58 ) ) || ( ( data[i] > 64 ) && ( data[i] < 90 ) ) || ( ( data[i] > 96 ) && ( data[i] < 123 ) ) || ( data[i] == '.' ) )
{
if( tag )
{
if( data[i] == '.' )
{
tag = false;
if( data[i + 1] == '/0' )
{
data[i] = '/0';
break;
}
}
}
else
{
if( data[i] == '.' )
{
break;
}
}
i ++;
}
if( data[i] != '/0' )
{
cout << "Warning: There are something illegal character in your input. Please input again. Notice: Only '0'-'9', 'A'-'Z', 'a'-'z' and '.' accepted, and then '.' is only allowed to appearance one time.";
data[0] = '/0';
continue;
}
t = min;
while( t < max )
{
t *= min;
}
for( i = 0; data[i] != '/0'; i ++ )
{
&