将十进制整数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;
}