2009年12月27日 星期日

TopCoder Algorithm Tutorials - 基礎數學

摘錄自:Mathematics for TopCoders

底數(base)
把 b 進位的數字轉成十進位,可以用下面這段 code 實現。簡單來說就是利用 mod 10 取出各個位數的數字,乘上 b 的 x 次方(multiplier)得到真正的值加到結果(result)中。
public int toDecimal(int n, int b)
{
   int result = 0;
   int multiplier = 1;
      
   while(n>0)
   {
      result += n % 10 * multiplier;
      multiplier *= b;
      n /= 10;
   }
      
   return result;
}

反過來把十進位的數轉成 b 進位呢?套用二進位轉換的想法,就是把原數字不斷除以 b 之後取餘數當作每個位數的值。而要當成一個數印出來就要先乘以 10 的 x 次方(multiplier)再累加起來。(這是因為程式語言還是用 10 進位在表現一個數字)
public int fromDecimal(int n, int b)
{
   int result = 0;
   int multiplier = 1;
      
   while(n>0)
   {
      result += n % b * multiplier;
      multiplier *= 10;
      n /= b;
   }
      
   return result;
}

那麼很自然會想到,能不能直接把 a 進位轉換成 b 進位呢?假設人類(或者說程式語言)可以支援 a 進位的除法與取餘數(mod),那應該是可以的。例如把七進位的 147(1110) 轉成二進位的話就像這樣可以得到是 10112
147 = 57 * 27 + 17
57 = 27 * 27 + 17
27 = 17 * 27 + 07
17 = 07 * 27 + 17
還蠻有趣的,假設我們背五進位的九九乘法表就會是:4*1=4、4*2=13、4*3=22...。