我正在寻找c中的基本转换函数,它可以进行从2到36的转换,包括带有字符A-Z的基数。
现在我刚刚在网络上找到了处理基数为2,十进制和十六进制且有限的网络功能。
答案 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,由你的基数表示为第零次幂。希望这会有所帮助。