2013年1月22日火曜日

TopCoder SRM454 Div2 250Pts

このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文についておおまかに説明する。

整数の桁の和は10進数で書かれた桁の和である。例えば1234は1+2+3+4=10になる。さて、A、B、Cという3つの整数が与えられる。AとBの間にあるXという整数で、Xの桁の和とCの桁の和の差の絶対値が最小になるものを返せ。もし複数のXがあり得るなら、その中で最小のものを返せ。

私の解答はこちら。

public class MinimalDifference {

 public int findNumber(int A, int B, int C) {
  int target = digit_sum(C);
  int diff = Integer.MAX_VALUE;
  int ans = A;
  for( int i=A ; i<=B ; i++ ){
   int currentDiff = Math.abs(target - digit_sum(i)); // 差の絶対値の計算
   if( currentDiff < diff ){ // Xの更新作業
    diff = currentDiff;
    ans = i;
   }
  }
  return ans;
 }
 private int digit_sum(int num){ // 桁の和を計算する関数
  // while文で0になるまで10で割った余りを足し、10で割ることを繰り返す方法もある
  String snum = "" + num;
  int s = 0;
  for( int i=0 ; i<snum.length() ; i++ ){
   s += snum.charAt(i) - '0';
  }
  return s;
 }
}

得点は235.47/250、1回のsubmitでシステムテストクリア。Xの更新作業では、複数の候補から最小値を返すので、<=としないように注意。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計