繼續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);
}
當然,這裏沒做數字變成字母的轉換。
關於改進,我能想到的就這麼多,還有其他方法的人可以提出來一起討論。