2009/5/8

使用C#作五進位與十進位轉換

老師出的奇怪的作業...不過其實挺簡單的,只要知道怎麼轉換,就寫的出來了
以下都是程式碼,只確定能跑不確定效率是不是最好的,如果有更好寫法請指教 XD
##ReadMore##

public int five2ten(int x)
{
int xlong = 0, numx = 0, numy = 0;
xlong = Convert.ToString(x).Length-1;
while (x != 0)
{
numx = x / Convert.ToInt32(Math.Pow(10, xlong));
numy += numx * Convert.ToInt32(Math.Pow(5, xlong));
x = x - (numx * Convert.ToInt32(Math.Pow(10, xlong)));
xlong--;
}
return numy;
}

五進位轉十進位,先用numx儲存五進位數的第一個數,numy儲存第一個數乘上5的x次方(x為五進位數字長度-1),再把原始的五進位減掉第一位數作為第二輪的五進位數,直到五進位數為0結束,最後回傳numy。
比較特別的地方是,為了要取輸入的五進位的長度,需要先將輸入的數轉為string型態,才方便用Lengh屬性去取出他的長度,取出後直接用一個變數去存就一勞永逸了。

EX:

2423(5)
step1. numx=2, numy=0(初始值)+2*5^3, x=423
step2. numx=4, numy=250+4*5^2, x=23
step3. numx=2, numy=350+2*5^1, x=3
step4. numx=3, numy=360+3*5^0, x=0
最後結果(numy): 360+3=363
因此 2423(5) = 363(10)

同理10進位轉5進位
public int ten2five(int x)
{
int numx = 0, numy = 0;
int count = 0;
while (x != 0)
{
numx = x % 5;
numy += numx * Convert.ToInt32(Math.Pow(10, count));
count++;
x = x / 5;
}
return numy;
}
首先用numx去紀錄進入的10進位除5的餘數,用numy儲存餘數乘上10的n次方,n從0開始(10^0=1),乘完後將次方數+1,最後將輸入的十進位x除五作為下一輪的x,直到x=0為止。
特別注意x必須為int型態,如果是double會出現小數...而且也不能直接運算XD

EX:

363(10)
step1. numx=3, numy=0+3*10^0, x=363/5=72
step2. numx=2, numy=3+2*10^1, x=72/5=14
step3. numx=4, numy=23+4*10^2, x=14/5=2
step4. numx=2, numy=423+2*10^3, x=2/5=0
最後結果(numy):423+2*10^3=2423
因此363(10) = 2423(5)


當初我最大的問題就出在那個次方....C#雖然有內建的Math函數,不過幾乎都是double型態,所以如果要直接代入int的計算中會出問題,所以要對Math.Pow函數進行轉型算出來的東西才會是正確的。

沒有留言:

張貼留言