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