2012年10月21日 星期日

對一數值擷取指定位數

我們常常會遇到需要對一組數值做擷取指定位數,也就是將一組數值的每一位數(個位數、十位數、百位數等等)分開來存放跟計算

最簡單的概念其實是轉成字串,然後利用 substring 之類的方法去擷取出來,但是要先將整數型別轉換成字串型別,擷取後又再度轉換成整數型別,這樣程式碼似乎沒有那麼精簡。

若從數學計算的角度來看,我們先簡化問題:

舉例來說:我們想從1234中,分別擷取個位數、十位數、百位數、千位數

千位數:從最高位數去思考最簡單,1234除以1000等於1.234,若將變數宣告為整數型態,則變數會存放1,也就會得到我們想要的1


百位數:1234除以100等於12.34,整數型態會取得12,但是我們需要的只是2,所以將12除以10然後取餘數,也就會得到我們想要的2

十位數:1234除以10等於123.4,整數型態會取得123,但是我們需要的只是3,所以將123和10相除取餘數,也就會得到我們想要的3

個位數:1234除以1等於1234,整數型態會取得1234,但是我們需要的只是4,所以將1234和10相除取餘數,也就會得到我們想要的4

由以上規則來看我們會發現,想將特定幾個位數之後(右邊)去掉的方式就是將其除以10的特定次方,利用整數型態的變數會將小數點直接刪除的特色去完成(千位數:除以10的3次方,百位數:除以10的2次方,十位數:除以10的1次方,個位數:除以10的0次方)

而想要把某個數值的個位數找出來,可以利用除以10,然後取餘數的方式概念上就是把十位數以上的數值過濾掉,除以10的動作,就會將10的倍數過濾掉了,而取餘數就是剩下來我們想要擷取的值

雖然我們在此範例的最高位數中,將只有一個位數的1除以10取餘數,答案是「0餘1」,還是原本的數值1,所以我們可以在以上的推導中找到固定的模式。

JAVA範例:
public class test {

 public static void main(String[] args) {
  System.out.println(digit(1234, 0)); // 個位數(n=0):4
  System.out.println(digit(1234, 1)); // 十位數(n=1):3
  System.out.println(digit(1234, 2)); // 百位數(n=2):2
  System.out.println(digit(1234, 3)); // 千位數(n=3):1
 }
 
 public static int digit(int number, int n) {
  return (int) (number / Math.pow(10, n) % 10);
 }

}

重點整理:

除以10的n次方之後,再和10取餘數
n 代表位數(個位數為0、十位數為1、以此類推)


這裡我們只先討論整數擷取特定位數的情形,若有小數點的情形等有時間我們再來研究。

1 則留言:

  1. Gambling - Casino. Dr.D
    There are 3 different types of 전라북도 출장샵 casino 부산광역 출장샵 games, 3 different payment methods, 3 different payment 동해 출장샵 options, and more. The most 전주 출장마사지 popular are cash games, slots, 부산광역 출장안마 and

    回覆刪除