我试图将任何数字从任何基数M转换为另一个基数N,我在我的代码中所做的是将插入的数字从基数N转换为十进制,然后将其从十进制转换为基数M.代码适用于任何小于37的基数,但它不处理分数。例如,如果输入的分数如1001.01,则转换不会正确显示。任何人都可以帮助我搞清楚我的错误吗?
我的代码:
#include <iostream>
int charToVal(char curChar)
{
char convArray[] =
{'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
for(int i=0;i<37; ++i)
{
if(curChar==convArray[i])
{
return i;
}
}
return -1;
}
char valToChar(int val)
{
char convArray[] =
{'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
if(val <37 && val>=0)
{
return convArray[val];
}
return ' ';
}
bool convertToDecimal(char * gdstr, int length, int inConvertor, int & decimal)
{
int factor = 1;
decimal=0;
std::cout << length;
for(int i=length-1; i >=0; --i)
{
int curVal(charToVal(gdstr[i]));
decimal += factor*curVal;
factor*=inConvertor;
}
std::cout << decimal << std::endl;
return true;
}
bool convertFromDecimal(int decimal, int outConvertor, char * outString, int & length)
{
int fact = 1;
length=0;
while (decimal > 0)
{
fact = decimal%outConvertor;
char curChar(valToChar(fact));
outString[length] = curChar;
decimal/=outConvertor;
length++;
}
return true;
}
int main()
{
char out[50];
int outLeng=0;
int decVal;
int inLeng;
std::cout << "Length of InFormat " ;
std::cin >> inLeng;
char any[inLeng];
for(int i = 0; i< inLeng; i++)
{std::cout << "In Format Num ";
std::cin >> any[i];}
int inType;
std::cout << "In Format Tyep" ;
std::cin >> inType;
int outtype;
std::cout << "Out Format Tyep" ;
std::cin >> outtype;
convertToDecimal(any, inLeng, inType, decVal);
convertFromDecimal(decVal, outtype, out, outLeng);
std::cout << std::endl << "out Type is :" << std::endl;
for(int i = outLeng-1; i >=0; --i)
{
std::cout << out[i];
}
std::cout << std::endl;
}
答案 0 :(得分:2)
要实现的第一件事是,与整数不同,小数值不能总是用有限位数的任意基数表示。例如,值0.1十进制不能精确地以二进制表示。因此,当从具有精确值的原点进行转换时,您可能需要在另一个基础中使用近似值。具体来说,如果目标基数不包括源库的所有素因子,则存在无法准确表示的值:例如,所有二进制分数都可以使用小数部分表示,但并非所有小数部分都可以使用二进制表示级分。
有一对算法用于进行两次转换。它们主要用于将基数10浮点值转换为基数2浮点值并返回到原始基数10值。如果原始值没有使用过多的数字作为近似值,往返将恢复原始值。算法在两篇开创性论文中提出:
具体来说,第二次转换并不像你希望的那样快,并且有改进,特别是Florian Loitsch的{{3}}。这些算法有点不重要。 Grisu是算法的实现。