通过欧几里得算法和霍纳方法转换数字
Posted
技术标签:
【中文标题】通过欧几里得算法和霍纳方法转换数字【英文标题】:Converting numbers by Euclidean algorithm and the Horner's method 【发布时间】:2013-05-12 15:55:44 【问题描述】:我的 C 代码有些问题。它没有按应有的方式转换数字。 这是将给定数字转换为具有不同基数的另一个数字的欧几里得算法。 “精度”是逗号后的位数。
static char* euclid(float number, int base, int precision)
//create a buffer for holding the resulting string
char* resultString = createBuffer(number, base, precision);
int numbTemp;
int numbDiv;
float maxExponent = 0;
while (number >= pow((float)base, (float)maxExponent))
maxExponent++;
maxExponent--;
if (maxExponent < 0)
maxExponent = 0;
while (maxExponent >= 0)
numbDiv = number / pow(base, maxExponent);
*resultString += converIntToChar(numbDiv);
numbTemp = numbDiv * pow(base, maxExponent);
number -= numbTemp;
maxExponent--;
if(maxExponent < 0 && precision >0)
*resultString += ",";
while(precision > 0)
numbDiv = number / pow(base, maxExponent);
numbTemp = numbDiv * pow(base, maxExponent);
*resultString += convertIntToChar(numbDiv);
number = number - numbTemp;
maxExponent--;
precision--;
return resultString;
将数字转换为字符:
static char convertIntToChar(int number)
if (0 <= number && 10 > number)
return number + '0';
else if (16 > number)
return number - 10 + 'A';
else
return '\0';
“数字”的输入始终是以 10 为底的数字。例如,我尝试使用 170,结果我希望将 170(以 10 为底)作为以 16 为底的数字返回,即 AA。 但我得到的结果是�。你能帮我找出问题所在吗?另外我用的是linux。所以我使用 gcc 编译器。 我也在尝试实现霍纳的方法,我得到与上面相同的结果(�) 我的 Horner 方法代码。
static char* horner(float number, int base, int precision)
// create a buffer for holding the resulting string.
char* resultString = createBuffer(number, base, precision);
int numbDiv = 0;
int numbTemp = 0;
int numbConv = 0;
do
numbDiv = number / base;
numbTemp = numbDiv * base;
numbConv = number - numbTemp;
number = numbDiv;
*resultString += convertIntToChar(numbConv);
while (number != 0);
return resultString;
问候 萩
【问题讨论】:
当我用逗号输入一个数字时,我再次得到这个符号�。举个例子,当我输入 15741.233(以 10 为底)时,我得到返回 3D7D�3(以 16 为底,精度为 4(逗号后的数字)),但它应该是 3D7D.3BA5。我不知道为什么会这样。有谁知道为什么? 我没有使用单引号字符。现在,我得到 3D7D.3 结果,但仍然缺少 3 位数字。有谁知道为什么? 【参考方案1】:您的问题是混淆了 *resultString
是什么;您应该将精度放在 resultString[idx] 中,其中 idx 是下一个索引,但您所做的只是将值添加到第 0 个字符,因为 *resultString 指向它;
这样做:
char * resultString = createBuffer(number, base, precision);
还好;
但是
*resultString += converIntToChar(numbDiv);
无稽之谈
声明一个索引变量;
char * resultString = createBuffer(number, base, precision);
size_t idx = 0;
现在稍后:
resultString[idx++] = convertIntToChar(numbDiv);
在你的 while();循环:
*resultString += ","; /* ??? */
变成
resultString[idx++] = ','; /* note single character quotes */
以及对 *resultString 的其他实例的类似处理;
一旦函数即将返回(即 resultString 准备就绪),您仍然需要一个终止 NULL 字符:
resultString[idx++] = 0;
return;
这也意味着您的 createBuffer 应该返回占最后 C 字符串的 NULL 字符的内存。
【讨论】:
感谢您的提示。它正在工作。你能帮我解决另一个问题吗?例如,数字 15741.233(以 10 为底)应返回为 3D7D.3BA5(以 16 为底)。我试过了,结果得到了 3D7D�3。你知道我的代码为什么会这样吗? 我不再得到 �。这是因为我没有做单字符引号。^^ 但是现在我得到 3D7D.3 并且仍然缺少 3 位数字。你知道为什么吗?【参考方案2】:*resultString += some char
没有将字符连接到字符串(如您所料),而是将some char
的整数值添加到resultString
的第一个字符。
【讨论】:
以上是关于通过欧几里得算法和霍纳方法转换数字的主要内容,如果未能解决你的问题,请参考以下文章