我在c中寻找一个基数转换函数,可以进行从基数2到36的转换,包括带有字符A-Z的基数。
就目前而言,我只是在网络上找到了处理基数2、10和十六进制的函数,而且有点有限。
发布于 2014-03-25 15:29:50
对于这个项目,理解bases是如何工作的可能会有所帮助。在任何情况下,让我们通过一个过程来了解如何转换为,比如说,基数12。这应该是最简单的实现方法。
首先,我们有十进制数,因为这是一个很容易开始的地方。假设,我不知道,1452是我们的号码。我们还需要一个字符数组来表示每个字符是什么,因为这比直接的ASCII转换要容易得多,在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'}
在那之后,我们可能只会将结果输出到另一个库中--以多种方式存储它是没有意义的,并且只将一个库转换为任何其他给定的库,从而使转换过程变得更简单。我们可以将结果存储在字符数组中,但同样,我们已经存储了数字-没有点。
对于我将要描述的这个方法,我们需要一个buffer变量来跟踪我们的数字,因为我们转换了它的一部分。
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,用你的基数的零次方来表示。希望这能有所帮助。
https://stackoverflow.com/questions/22638677
复制相似问题