从C的任何碱基到任何碱基的碱基转化(最多36个)

时间:2014-03-25 15:11:36

标签: c function base

我正在寻找c中的基本转换函数,它可以进行从2到36的转换,包括带有字符A-Z的基数。

现在我刚刚在网络上找到了处理基数为2,十进制和十六进制且有限的网络功能。

1 个答案:

答案 0 :(得分:1)

对于这个项目,它可能有助于理解基础如何工作。在任何情况下,让我们来看看如何转换为例如12个基数的过程。这应该是最简单的实现方法。

首先,我们有十进制数,因为这是一个容易的起点。让我们说,我不知道,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,由你的基数表示为第零次幂。希望这会有所帮助。