您的位置:首页 > 其它

将十进制整数转换成b进制字符串 (递归和非递归实现)

2014-05-21 17:24 260 查看
将十进制整数n转换成b进制后,再转化成字符串到s

即实现IntToString(int n , char* s, int b)函数。

这里用两种方式实现它:递归 和 非递归,下面为c++源代码。

#include <iostream>
#include <string.h>
using namespace std;

//递归实现intToString
/*
*函数功能:将十进制整数n转换成b进制后,再转化成字符串到s
*函数参数:n 表示十进制整数,可正可负
*        s 表示存取的字符串
*        b 表示进制数
*/
void intToString_Recursion(__int64 n, char* s, int b)
{
//下面这条语句静态变量 i 表示字符数组的下标
//当n >= 0 时,需做两件事:1 、不管n是不是0,令s = "0" (注意在字符串后加'\0')
//                       2 、i = 0,表示s从下标 0 开始保存各位数的信息
//当n < 0 时,要做三件事: 1 、第一位存符号位 '-';
//                       2 、n 取绝对值;
//                       3 、i = 1, 表示s从下标 1 开始保存各位数的信息
static int i = (n >= 0 ? (s[0] = '0', s[1] = '\0' ,0) : (s[0] = '-', n = -n, 1) );

static char bChar[16] =    //记录十六进制字符的信息(其实可以超过十六进制,只需在后面加字符)
{'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

if(n != 0)
{
intToString_Recursion(n/b, s , b);  //第一次除运算为最后一位结果,压如栈底
s[i++] = bChar[n%b];                //从栈内读取字符
s[i] = '\0';                        //为了保证字符串结束带有'\0',不惜时间代价在每次添加字符的后面加上'\0',可以被覆盖
}
}

//非递归实现intToString
/*
*函数功能:将十进制整数n转换成b进制后,再转化成字符串s
*函数参数:n 表示十进制整数,可正可负
*          s 表示存取的字符串
*          b 表示进制数
*/
void intToString_NonRecursion(__int64 n, char* s, int b)
{
static char bChar[16] =    //记录十六进制字符的信息(其实可以超过十六进制,只需在后面加字符)
{'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

int i = 0;

if(0 == n)
{                  //n = 0:
s[0] = '0';    //令s = "0"
s[1] = '\0';
return;        //直接返回
}
else if(n < 0)
{                 //n < 0:  ,
s[0] = '-';   //给第一位赋值符号位'-'
n = -n;       //取反
i = 1;        //令i = 1,表示从i开始保存数字
}

while(0 != n)
{                 //逆序记录b进制数字
s[i++] = bChar[n%b];
n = n / b;
}
s[i] = '\0';

int high = strlen(s) - 1;
int low = s[0] == '-' ? 1 : 0;  //跳过'-'
while(low < high)
{                 //将字符串逆序
char t = s[low];
s[low] = s[high];
s[high] = t;

low++;
high--;
}
}

int main()
{
char s[50];
char s1[50];
intToString_Recursion(-12345678999999, s , 2);   //递归函数测试

intToString_NonRecursion(-12345678999999, s1, 2);//非递归函数测试

cout<<s<<endl;
cout<<s1<<endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: