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

时间:2014-07-23 17:04:25

标签: c base base-conversion

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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

4 个答案:

答案 0 :(得分:1)

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

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

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

#include <stdio.h>

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);
}

答案 1 :(得分:0)

似乎整数值溢出。例如,基数2中的十进制值1023是1111111111.如果它是一个4字节的整数,那么当尝试&#34;添加&#34;再多一位(在这种情况下,最大有符号整数是2147483647)。

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

答案 2 :(得分:0)

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

我严重怀疑你真的打算改变整数的实际值,正如你所做的那样。就像上面提到的@ThoAppelsin一样,无论您选择哪种基础进行展示,包中的苹果数量都保持不变。

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

答案 3 :(得分:0)

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

.d.ts

您可以在本文中找到完整的数学和实现:Converting Number Bases