2010/01/08

[Java]整数の各桁を足し合わせる問題

■ 整数の各桁を足し合わせる問題

5分で終わると聞いてやってみました。
5分問題 やってみた。 - 地獄の猫日記

■ ということで、作ってみた

負数が入力だった場合どうすれば良いのか解らなかったので、とりあえずマイナスは無視して数字を全部足す事にした。
・無難(?)な回答
public class PlaceNumberAdder02 {
   long number;
   public PlaceNumberAdder02(long number){
      setNumber(number);
   }

   public long addNumbers(){
      long number = this.number;
      long sum = 0;
      
      number = Math.abs(number);
      
      do {
         sum += number % 10;
      } while((number /= 10) != 0);
      
      return sum;
   }
   
   public void setNumber(long number){
      this.number = number;
   }
   
   public long getNumber(){
      return number;
   }
}
・変態(?)回答
public class PlaceNumberAdder01 {
   long number;
   public PlaceNumberAdder01(long number){
      setNumber(number);
   }
   
   public long addNumbers(){
      String numberStr = String.valueOf(number);
      long sum = 0;

      if(number < 0){
         numberStr = numberStr.substring(1);
      }
      
      for(int i = 0; i < numberStr.length(); i++){
         sum += Integer.parseInt(numberStr.substring(i, i+1));
      }
      
      return sum;
   }
   
   public void setNumber(long number){
      this.number = number;
   }
   
   public long getNumber(){
      return number;
   }
}
変態回答が01なのが問題だよねー。
・...言い訳をさせてもらうと
「3の倍数 or 3を含む」数の時にアホと表示するプログラムを書いた時に、数字を文字に変換して処理を行ったもんで、今回もそののりで書いてみた感じ。
普通に処理した場合(PlaceNumberAdder02)に比べて2から2.5倍くらい遅くなります。
しかし、プログラムの形的にも面白みの無い物になってしまったなぁ...。
あと、名前とかもっと考えようよ、自分。

■ テスト

・テストコード(とは言えない何か)
public class PlaceNumberAdderTest {
   static final long l1 = 1234, l2 = 9999, l3 = -65535;
   
   public static void main(String[] args) {

      System.out.println("Number = " + l1);

      PlaceNumberAdder01 pna1 = new PlaceNumberAdder01(l1);
      System.out.println("pna1: " + pna1.addNumbers());
      
      PlaceNumberAdder02 pna2 = new PlaceNumberAdder02(l1);
      System.out.println("pna2: " + pna2.addNumbers());

      System.out.println();
      System.out.println("Number = " + l2);

      pna1.setNumber(l2);
      System.out.println("pna1: " + pna1.addNumbers());
      
      pna2.setNumber(l2);
      System.out.println("pna2: " + pna2.addNumbers());

      System.out.println();
      System.out.println("Number = " + l3);

      pna1.setNumber(l3);
      System.out.println("pna1: " + pna1.addNumbers());
      
      pna2.setNumber(l3);
      System.out.println("pna2: " + pna2.addNumbers());

   }
}
・実行結果
Number = 1234
pna1: 10
pna2: 10

Number = 9999
pna1: 36
pna2: 36

Number = -65535
pna1: 24
pna2: 24
こんな感じ。