itoa函数作用是将整型数通过加’0’保存在字符数组中
递推情况下
#include<stdio.h>
void itoa(char s[] , int n){
int i=0;
int sign;
if((sign=n)<0){
n=-n;
}
s[i++]='\0';
do{
s[i++]=n%10+'0';
} while(n/=10);//需要注意n是逆序排列在数组中的
if(sign<0){
s[i]='-';
}
for(int j=i;j>=0;j--){
printf("%c",s[j]);
}
}
int main(){
char s[1000];
int n;
scanf("%d",&n);
itoa(s, n);
return 0;
}
递归情况下:
#include<math.h>
void itoa(int n, char s[]){
static int i=0;
if(n/10){
itoa(n/10,s);
}
else{
i=0;
if(n<0)
s[i++]='-';
}
s[i++]=abs(n)%10+'0';
s[i]='\0';
}
在递归的程序中,把 i 设置为静态变量,保证在递归调用过程中,存储在内存空间中的 i 都是同一份。
在递推的程序中,由于求n%10+‘0’的顺序是从低位到高位,所以在输出字符数组时需要逆序输出。
而在递归程序中,调用的顺序是由内而外,最内层的数先被存入字符数组,所以将会从左至右的顺序计算出整数n的每一位数字。
在递归中,可以看到每次递归调用都将会写入是s[i]=’\0’,然而到了上一层递归调用时,’\0’就会被下一位数字覆盖掉,直到最外层的 ‘\0’ ,没有数字可以覆盖它了,字符数组结束。