我的編程學習日誌(2)--進制轉換的優化

繼續1中的進制轉換問題,上一個程序以及實現了一個簡單的進制轉換,不過他卻還可以改進,下面就來談談他的改進思路及實現。

 

一、省略數字轉字母的過程

上個程序中用一個if判斷來把10以上的數字用字母輸出,即:

for(i=i-1;i>=0;i--)  
    {  
        if(yu[i]>10)  
        {  
            yu[i]=yu[i]+55;  
            cout<<(char)yu[i];  
        }  
	else  
            cout<<yu[i];  
    }  

 

這個做法顯然增加了程序執行的時間,因爲沒有要求轉換的數字要用於計算,就可以在保存餘數是把餘數保存爲字符,省略數字轉字母的過程:

char list[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn";
int main()
{
	char yu[100];
	int n,m,i;
	i=0;
	cin>>n;
	cin>>m;
	while(n)
	{
		yu[i]=list[n%m];
		n=n/m;
		i++;
	}
}



這樣就不用判斷直接輸出了!

 

二、用遞歸代替循環

想想我們的轉換思路,我們先用n/m取餘數,再用他的商除以m取餘,即:(n/m)/m,這樣一直循環下去,那麼我們就可以用遞歸來代替循環了,同時也省略了輸出的for循環,只要在主函數輸入n,m即可,實現過程如下:

void solve(int n,int m)
{
        if(n)
        {
          solve(n/m,m);
          cout<<n%m;

        }
}
int main()
{
        int n,m;
        cin>>n;
        cin>>m;
        solve(n,m);
}

 

當然,這裏沒做數字變成字母的轉換。

 

關於改進,我能想到的就這麼多,還有其他方法的人可以提出來一起討論。

 

 

發佈了26 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章