C++ 从M基转换到N基时的处理分数?
我试图将任意数字从任意基数m转换为另一个基数N,我在代码中所做的是将插入的数字从基数N转换为十进制,然后将其从十进制转换为基数m。我的代码适用于任何小于37的基数,但它不处理分数。例如,如果输入具有类似1001.01的分数,则转换结果不正确。有人能帮我找出我的错误吗 我的代码:C++ 从M基转换到N基时的处理分数?,c++,C++,我试图将任意数字从任意基数m转换为另一个基数N,我在代码中所做的是将插入的数字从基数N转换为十进制,然后将其从十进制转换为基数m。我的代码适用于任何小于37的基数,但它不处理分数。例如,如果输入具有类似1001.01的分数,则转换结果不正确。有人能帮我找出我的错误吗 我的代码: #include <iostream> int charToVal(char curChar) { char convArray[] = {'0','1','2','3','4','5',
#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;
}
#包括
int chartova(char curChar)
{
字符数组[]=
{'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'};
对于(int i=0;i any[i];}
int型;
std::cout>inType;
int-outtype;
std::cout>outtype;
convertToDecimal(any、inLeng、inType、decVal);
convertFromDecimal(decVal、outtype、out、outLeng);
std::cout首先要认识到的是,与整数不同,分数值不能总是用有限位数的任意基数表示。例如,0.1十进制值不能用二进制精确表示。因此,当从具有精确值的原始基数转换时,可能需要在另一个基数中使用近似值具体来说,如果目标基不包括源基的所有素数因子,则存在无法准确表示的值:例如,所有二进制分数都可以使用十进制分数表示,但并非所有十进制分数都可以使用二进制分数表示
有一对算法用于进行两次转换。它们主要用于将基数为10的浮点值转换为基数为2的浮点值,然后再转换回原始的基数为10的值。假设原始值没有使用过多的数字作为近似值,则往返过程将恢复原始值。下面介绍了这些算法d在两篇开创性论文中:
用于从精确表示转换为近似表示
用于从近似表示转换回原始值
具体来说,第二次转换没有您希望的那么快,并且有一些改进,特别是Florian Loitsch的。算法有些复杂。是算法的实现。尝试使用调试器“转换结果不正确”-你应该在你的帖子中包括你得到的输出和你期望的输出。你可以直接这样做,不需要通过十进制。你的问题不是关于浮点,而是关于处理小数部分。如何直接这样做?你的两个convArray
(略)浪费,因为它们在每次调用时都在每个函数中初始化。您可以在文件范围内使它们static const char convArray[]
,以便它们在程序启动时初始化一次,然后简单地使用。