2014-03-25 58 views
-1

即时寻找一个碱基转换函数在c中可以做从碱基2转换到36,包括碱基字符A-Z。从任何碱基到C中的任何碱基的碱基转换(最多36)

现在我刚刚在网页上发现的功能,处理基地2,十和十六进制和有限的。

+5

你应该真的记下你已经拥有的代码,并且询问它为什么是或者不工作的具体问题。 – ryyker

+0

[将十进制转换为任意基数的可能的重复?](http://stackoverflow.com/questions/19072348/converting-a-decimal-to-any-radix-base-number) – ryyker

+1

'strtol()'它的亲戚会将任何一个从2到36的字符串转换为二进制。我不认为在任意基础中有格式化数字的标准函数(8,10和16可以用'printf()'等来实现,但其他基础不支持作为标准)。 –

回答

1

对于这个项目,这可能有助于了解基地如何工作。无论如何,让我们通过一个过程来说明人们如何转换成十二进制。这应该是最简单的实施方法。

首先,我们有我们的小数,因为这是一个容易开始的地方。比方说,我不知道,1452是我们的号码。我们还需要一个字符数组来表示每个字符的内容,因为这比直接的ASCII转换更容易,其中数字字符和字母字符是分开的。

int dec=1452; 
int toBase=12; 
char outputs[36]={'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 buf=dec; 

接下来,我们将开始在我们要去的基地计算空间12,并查看每个空间的价值。我们会继续,直到我们通过我们的号码,然后回溯一个。我们还需要保存从for循环到第一个空间的空间。

int space=0; 
while(Math.pow(toBase,space))<buf){ 
    space++; 
}//Braces added for clarity 
space--; 

现在,这是主要的计算循环,我们将输出结果。同样,原始数字仍然存储在'dec'中,所以我们不必担心丢失数据或者改变数据。

int i; 
for(i=space;i>=0;i--){//We have set up the for loop to check each space as we progress 
    int modResult=buf%Math.pow(toBase,i);//Gets the number that goes in this space of the resulting base number 
    buf-=modResult*Math.pow(toBase,i);//We have that, so take it out of the number 
    printf("%c",outputs[modResult]); 
} 

因为我们正在做这个,从顶部空间去底部,modResult绝不会高于最高值越高我们的基地可以进去,随着这个问题的方法,你的程序将输出到控制台由此产生的数字。另外,请记住,这仅输出数字 - 为了存储和计算的目的,使用基数为10的内置函数要简单得多。此外,请注意toBase变量永远不会超过36.

作为进一步的说明,我从右到左编号数字(空格),从零开始,因为最右边的空间是1,由您的基数表示为零。希望这可以帮助。

+0

不错的答案,但有一些建议:对'outputs'数组使用常量字符串(而不是单个char字符串)。另外你的代码非常密集......你已经把所有的空间都拿走了,这使得它不易读。例如,'for(i = space; i> = 0; i - )'最后,'pow()'在这里有点矫枉过正,因为它是浮点数可能很危险。只需保留一个单独的值变量,每次通过循环时都乘以toBase。 – TypeIA