http://blog.csdn.net/sailor_8318/article/details/1777759
--------------------------------------------------
【序】“將給定的一個整數轉換成字串”是面試中常見的考題,本文參考了兩位CSDN博友的文章,在此感謝!
從低位開始轉換,然後再翻轉字串是最容易想到的方式;先確定該整數的位元,模數運算從低位開始,將儲存的位置遞減,此方法無需翻轉字串,因此整體效率較高,值得借鑒。 受先確定該整數的位元的思想啟發,我想取商運算從高位開始也可以,並且是順序儲存,無需翻轉字串 從獲得最高位的方法,我又獲得了一點想法,那就是用遞迴的方式來獲得最高位,遞迴的條件很簡單,只要參數不為10以內,即表示當前未找到最高位,當然遞迴退出的條件是當前數為個位元了 發現很多演算法都有一定的共性,總能找到其中的某些聯絡,我相信只要大家善于思考,舉一反三,從不同的角度包括時間效率空間效率去考察時,定會受益良多最後一個遞迴演算法稍有瑕疵,歡迎朋友們討論! ************************************************將給定的一個整數轉換成字串Sailor_forever sailing_9806@163.com 轉載請註明×××××××××××××××××××××××××××××××演算法一 計數互換 下面的這個演算法顯示了一個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變數儲存轉換的次數,最後遞迴退出時將返回的指標減掉該值即為最初的指標值,畢竟這個問題在面試中並不嚴重,沒有深思,感興趣的朋友可以試試 各位朋友有其他更好的方法歡迎討論!×××××××××××××××××××××××××××××××參考資料:http://blog.csdn.net/ammana_babi/archive/2006/07/18/936918.aspxhttp://blog.csdn.net/kimn/archive/2005/01/14/253434.aspx