在数字基数之间转换的递归函数在某些数字处失败

我正在尝试创建一个算法,可以将基数为10的数字转换为基数为n的数字,其中n最多为10.但是,由于某些奇怪的原因,C中的以下算法在每个基数的某些关键点处失败。 例如,对于基数2和基数3转换,分别包括1023和52,487的所有数字都有效,但超出该数字的数字会产生一些奇怪的负面结果。 我无法弄清楚为什么会这样; 谁能帮我?

#include  #include  #include  int returnint; int baseconvert(int number,int base) { if(number == 0 || base == 10) { return returnint; } returnint = (number % base) + (10 * baseconvert(number / base, base)); return returnint; } int main() { fprintf(stdout,"%d\n",baseconvert(1023,2)); fprintf(stdout,"%d\n",baseconvert(52487,3)); } 

编辑:

以下是上述打印陈述的打印结果,如果有帮助的话:

 1410065408 -2094967296 

似乎整数值溢出。 例如,基数2中的十进制值1023是1111111111.如果它是4字节整数,那么当尝试“添加”另一个数字时,它将溢出(在这种情况下,最大有符号整数为2147483647)。

由于看起来您的目标是在不同的基础上显示数字,因此将数字存储在字符数组中可能更有意义。

您的算法在数字与基数范围内非常有限。 基数越小,表示它的数字就越多。 由于您以十进制forms存储结果,因此您将非常快速地浪费可用数据范围。 没有基本数据类型可以保存所有可能输入的结果。 例如,最大31位十进制数(正常整数,丢弃符号位)将导致31位输出!

您有几种方法可以解决这个问题:

  • 分配足够大的堆栈并将数字推入其中。 完成后,打印堆栈内容。
  • 立即打印数字而不保存,这将消除分配任何内容的需要。 例如:

 #include  void baseconvert(int number,int base) { if(number > 0) { int digit = (number % base); baseconvert(number / base, base); printf("%d",digit); } else { printf("\n"); } } int main() { baseconvert(1023,2); baseconvert(52487,3); } 

在我所知道的所有处理器上,整数已经以二进制forms存储; 这意味着基数2.这个值可以显示在你想要的任何基础上,你需要做一些工作。 printf()和朋友允许您轻松打印基数10(%d)和基数16(%x)。 不难想象将二进制(基数2)整数值转换为基数n中的字符表示的方法。

我非常怀疑你真的打算改变整数的实际值,正如你所做的那样。 就像上面提到的@ThoAppelsin一样,无论您选择哪个底座显示,包中的苹果数量都保持不变。

通过简单地创建一个表示(用数字)任何基数中的整数的方法,您还将解决溢出问题!

您的结果溢出整数范围。 尝试使用字符串。 这是伪代码,它依赖于字符串来表示数字,它可以将数字从任何基数转换为2到36之间的任何其他基数(使用数字和大写字母):

 function ConvertNumber(number, b, d) begin newNumber = "" while number <> "0" begin number = Divide(number, b, d, out remainder) newDigit = ValueToDigit(remainder) newNumber = Concatenate(newDigit, newNumber) end if newNumber ="" then newNumber = "0" end function Divide(number, base, divisor, out remainder) begin remainder = 0 result = "" for i = 0 to Length(number) - 1 begin digitValue = DigitToValue(number[i]) remainder = base * remainder + digitValue newDigitValue = remainder / divisor -- integer division remainder = remainder mod divisor if newDigitValue > 0 OR result <> "" then newDigit = ValueToDigit(newDigitValue) result = Concatenate(result, newDigit) end if result = "" then result = "0" return result end 

您可以在本文中找到整个数学和实现: 转换数字基础 。

Interesting Posts