【序】“将给定的一个整数转换成字符串”是面试中常见的考题,本文参考了两位CSDN博友的帖子,在此感谢!
从低位开始转换,然后再翻转字符串是最容易想到的方式;先确定该整数的位数,取模运算从低位开始,将保存的位置递减,此方法无需翻转字符串,因此整体效率较高,值得借鉴。
受先确定该整数的位数的思想启发,我想取商运算从高位开始也可以,并且是顺序存储,无需翻转字符串
从获得最高位的方法,我又获得了一点想法,那就是用递归的方式来获得最高位,递归的条件很简单,只要参数不为10以内,即表示当前未找到最高位,当然递归退出的条件是当前数为个位数了
发现很多算法都有一定的共性,总能找到其中的某些联系,我相信只要大家善于思考,举一反三,从不同的角度包括时间效率空间效率去考察时,定会受益良多
最后一个递归算法稍有瑕疵,欢迎朋友们讨论!
************************************************
将给定的一个整数转换成字符串
×××××××××××××××××××××××××××××××
算法一 计数互换
下面的这个算法显示了一个C语言新手所应有的水平。而且处理不完全,算法考虑不周到,代码过于啰嗦,不够简洁。
char * IntToStr(int Number)
{
char ch,*str,*t;
int i ,Len=0;
str = (char *)malloc(11*sizeof(char));
t = str;
while(Number!= 0)
{
*t = (Number %10)+0x30;
Number = Number /10;
Len++;
t++;
}
*t = '\0';
t = str;
for(i=0;i<Len/2;i++)
{
ch = *t;
*t = *(t+Len-2*i-1);
*(t+Len-2*i-1) = ch;
t++;
}
return str;
}
×××××××××××××××××××××××××××××××
算法二 指针,首尾互换
char * IntToStr(int Number)
{
char ch,*str,*right,*left;
unsigned int Value;
str = (char *)malloc(12*sizeof(char));
left = right = str;
//如果是负数,则应加上负号,left、right向后走。
if(Number < 0)
{
Value = -Number;
*str = '-';
left++,right++;
}
else
Value = (unsigned)Number;
//把数字转换成字符串(倒置的)
while(Value)
{
*right = (Value%10)+0x30;
Value = Value/10;
right++;
}
*right-- = '\0';
//把倒置的字符串正放过来
while(right > left)
{
ch = *left;
*left++ = *right;
*right-- = ch;
}
return str;
}
上面的函数在内部申请动态空间,返回给调用者后需要调用者释放空间,不满足模块间的耦合特性,因此函数原型最好为
char * IntToStr(int Number, char * output)
output指针由调用者自己申请的堆区或自动分配的栈区,IntToStr将转换后的字符串保存即可
×××××××××××××××××××××××××××××××
算法三 取模,从低到高
先求出当前整型数按照十进制有几位数,算出最低位转换后存放的地址求模,取出最低位,从高地址往低地址存,好处是不用翻转字符串
char* up_str_from_i(int i_in,char* str_out)
{
int t_i_in;
int t_num_count=0;
char * back = str_out;
if (i_in<0)
{
i_in*=(-1);
*str_out++='-';
}
t_i_in=i_in;
while (t_i_in /= 10)
t_num_count++;
//先求出当前整型数按照十进制有几位数,算出最低位转换后存放的地址
//求模,取出最低位,从高地址往低地址存,好处是不用翻转字符串
str_out+=t_num_count;
str_out++;
*str_out='\0';
str_out--;
do
{
*str_out = i_in % 10+'0';
if (i_in/=10)
str_out--;////if there r some num forword ,so str_out go back
}while (i_in%10);///if there r some num ,so loop
return back;
}
×××××××××××××××××××××××××××××××
算法四 求余,从高到低
先求出当前整型数按照十进制有几位数,算出求余时取出最高位应该除的数devide_num,以后devide_num每次除以10,求余从高到低依次取出各位,从低地址往高地址存,好处是不用翻转字符串
char* down_str_from_i(int i_in,char* str_out)
{
int t_i_in;
unsigned int devide_num=1;
char * back = str_out;
if (i_in<0)
{
i_in*=(-1);
*str_out++='-';
}
t_i_in=i_in;
while (t_i_in /= 10)
devide_num*=10; // updating devide_num by multiplying 10
printf("the absolute integer is %d, and devide_num is %d\n",i_in,devide_num);
while (i_in/10)
{
*str_out ++= i_in/devide_num +'0';
i_in %= devide_num;
devide_num/=10;
//更新除数和被除数
}
*str_out++ = i_in+'0'; //个位数
*str_out++ = '\0';
return back;
}
×××××××××××××××××××××××××××××××
算法五 递归寻找高位
char* rcsv_str_from_i(int i_in,char* str_out)
{
//static unsigned count=0;
// in case it is a minor integer for the first time
if (i_in<0)
{
i_in*=(-1);
*str_out++='-';
}
if(i_in/10) // not the most important bit in decimal, then recursively calling itself
{
str_out = rcsv_str_from_i(i_in/10,str_out);
*str_out++=i_in%10+'0';
*str_out = '\0'; // in case this is the last step
}
else// the most important bit
{
*str_out++=i_in+'0';
*str_out = '\0'; // in case this is the last step
}
// return the address for the next valid char
return str_out;
}
int main(void)
{
int i;
char str_out[100];
while(1)
{
scanf("%d",&i);
printf("up method gets %s\n",up_str_from_i(i,str_out));
printf("down method gets %s\n",down_str_from_i(i,str_out));
rcsv_str_from_i(i,str_out);
printf("recursive method gets %s\n",str_out);
}
return 0;
}
此递归算法源于上面的down方法,down方法的本质是找到最高位,然后从高位依次取出各位,按照数组顺序依次存储,不需翻转字符串。
因此继续递归的条件是当前数大于10,即仍未到达最高位
递归退出的条件是当前是个位数,即表示找到了最高位,退出时要将改动后的指针值传给上层调用者
每层递归退出后要保存个位数,依次向上退出,即可转换初始数的最后一位
目前该递归方法的缺点是不能实现链式操作,即最后一次返回的指针值不是函数调用者传进来的值,我想通过static变量保存转换的次数,最后递归退出时将返回的指针减掉该值即为最初的指针值,毕竟这个问题在面试中并不严重,没有深思,感兴趣的朋友可以试试
各位朋友有其他更好的方法欢迎讨论!
×××××××××××××××××××××××××××××××
参考资料:
分享到:
相关推荐
C/C++面试之算法系列--几个典型的内存拷贝及字符串函数实现 写一个函数,完成内存之间的拷贝。[考虑问题是否全面,是否考虑内存重叠问题] 返回void *支持链式操作,参数类型是void *以支持任意类型的指针,输入...
#二维码(QRcode)生成算法 C语言/C++ 源码 1. 根据输入字符串识别编码模式; 2. 根据输入字符串长度选择合适的QRcode版本; 3. 将编码转换为二进制位流表示为数据码字; 4. 使用多项式生成纠错码; 5. 将数据码和...
中英文字符串的切割边界的确定算法 >> 一些背景知识: 1. 一个汉字在c\c++的存储, 使用2个字节(char)存储; 2. 汉字存储的第一个char, 其值一定大于'~'(0111 1110=126),否则将导致识别歧义; 此处, 使用"单ASCII...
本书以流行的面试题讲解为主要内容,介绍了C、C++语言基本概念,包括保留字、字符串、指针和引用、结构体、库函数等各个方面的基础知识,介绍了面向对象编程基本概念,包括如何实现继承、多态和封装等。还介绍了排序...
基于Qt写了一个字符串加密的算法模块(有源码),并封装成了动态库,有测试用例。实现的加密解密算法是AES加密对称算法和BlowFish。用户可以直接用动态库,也可以用源码编译。
C++分割字符串算法,分割后的目标字段存储在容器中
字符串匹配算法之Sunday算法C++实现
用C++实现BM的字符串模式匹配算法,两个代码分别实现坏字符规则和好后缀规则
使用C/C++实现了古典加密的替代加密和置换加密,经过测试,功能还算强大,替代加密可以处理任意字符串的加解密操作,置换加密算法可以处理任意的key和任意的明文加密与密文解密。
本程序的执行效率未被验证和测试,仅用于初学者做算法研究
运行程序之后输入任意的字符串,将字符串转化成二进制数字字符串,然后利用LZ78算法实现对二进制字符串压缩解压,最后再恢复原来的字符串
} b)请编写一个 C 函数,该函数将给定的一个字符串转换成整数。 int Invert(char *str) { int num=0; while(*str!='\0') { int digital=*str-48; num=num*10+digital; ...
C语言,C++字符串处理函数,涵盖了不少的字符串处理的算法。
将浮点数转为字符串的具体算法在网上少有涉及,一般都采用浮点法,即通过浮点运算确定需要的每一位上的数字。本文介绍的方法是定点法,即对IEEE 745[1]的浮点数编码规范进行硬解码。这种方法效率不高,但是精度确很...
KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度为O(m+n).。先来看一个简单匹配算法的函数:此算法的思想是...
摘要:VC/C++源码,加密解密,MD5,加密算法 VC++源代码写的用于md5加密算法的一个DLL组件源码,虽然是半成品,不过学习一下VC++中编写DLL也是不错的选择,另外还可以研究MD5加密算法具体实施代码。 运行环境:Windows/...
基于字符串模式匹配算法的病毒感染检测问题——C语言实现。
cpp代码-C/C++ 字符串匹配算法时间复杂度比较
功能是把定长字符串映射为整数,目的是找到比用C++标准库无序映射unordered_map更快的算法。所有字符串的长度都一样,且初始化之后只有查询,没有增删改。不同功能字符串长度也不同,但不超过16。本程序随机生成长度...
//插入一段字符串 function str_insert($str, $i, $substr) { for($j=0; $j<$i; $j++){ $startstr .= $str[$j]; } for ($j=$i; $j($str); $j++){ $laststr .= $str[$j]; } $str = ($startstr . $substr . $laststr);...