要求:
用遞歸的方法將一個整數n轉換成字符串。例如,輸入438,應輸出“483”。n的位數不確定,可以是任意的整數。
分析:應該將輸入的數中的每個數進行剝離,然后從頭到尾將每個數字轉化為對應的字符。遞歸函數Covert需要完成的工作是,當n不是個位數(n/10!=0)的時候,將n/10作為參數進行遞歸調用函數Covert,然后將數字n的最后一位數字轉化為字符串。因為每次的遞歸調用Covert函數,是發生在將n的最后一個數字轉化為字符串的操作之前的,所以會依次將數字n的每個數字轉化為字符。
方法一:
#include <iostream>
using namespace std;
void Convert(int n)
{
char p;
if(n/10 != 0)
{
Convert(n/10); //通過遞歸輸出
}
p=n%10+48;//將數字轉化成對應的字符串 ,並將最后一位數字轉化為字符
cout<<p;
}
int main()
{
int n ;
cout<<"please input an integer:";
cin>>n;
cout<<"Outcome:";
if(n<0){
n=-n;
cout<<"-";
Convert(n);
}else{
Convert(n);
}
cout<<endl;
return 0;
}
分析:
首先在main函數中輸入一個整數,然后通過Covert函數的遞歸,將n中每個數字轉化為對應的字符,並輸出。
核心代碼是:
p=n%10+48;這一句,原理是將當前的Covert(n ),中n的最低位進行輸出。
方法二:
#include<iostream>
using namespace std;
char * Covert(int n, char * pointer){
char * p=pointer;
if(n/10!=0){
p=Covert(n/10,p);
}
*p=n%10+'0';//將數字轉化為字符
++p;
*p='\0';//為字符最后添加'\0'
return p;
}
int main(){
int n;
char buffer[20];
cout<<"please input an integer:";
cin>>n;
cout<<"\nOutput:";
if(n<0){
n=-n;
Covert(n,buffer);
cout<<"-"<<buffer<<"\n\n";
}else{
Covert(n,buffer);
cout<<buffer<<"\n\n";
}
return 0;
}
貌似這個方法才更加符合題意,這是參照:http://zhidao.baidu.com/question/502758422.html
分析:
1、將數字轉化為對應的字符,可以通過n%10+48來實現,也可以通過n%10+'0'來實現,因為‘0’的ASCII碼的數值就是48
2、該算法中建立了一個數組buffer用來存放字符串,通過遞歸調用讓數字前往后依次轉化為字符,然后通過指針p的自增,將字符串依次存放到數組中,每次p自增之后都賦值‘\0’,當還有新的字符需要轉化的時候,就會有新的值覆蓋‘\0’,當沒有新的數字轉化的時候,就最為字符串的結束標志。
