2012年3月13日火曜日

TopCoder SRM342 Div2 250Pts

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

xという数字が与えられたとき、p(x)はxの各桁の積と定義する。すると、x、p(x)、p(p(x))のように数列を作成できる。xのpersistence(持続性などと訳されるか)とは、数列中の値がはじめて1桁の数字になったときの数列の添え字である(先頭は0とする)。例えば99は9*9=81、8*1=8なので2となる(数列としては99、81、8である)。さて、nという数値が与えられたとき、その数字のpersistenceを求めて返せ。

私の解答はこちら。

public class PersistentNumber {

 public int getPersistence(int n) {
  int nPersist = 0;
  while( true ){
   if( n<10 ) break; // 終了条件
   int tmp = n % 10;
   n = n / 10;
   while( n > 0 ){ // 数列の次の値を計算
    tmp *= n % 10;
    n = n / 10;
    System.out.println(tmp);
   }
   nPersist++; // 添え字を1つ進める
   n = tmp;
  }
  return nPersist;
 }

}

得点は226.31/250、中央値は約228点。各桁の積をどのように定義するかというのが考えどころ。

2 件のコメント:

  1. まずはwhile(true) + ifを一つにまとめる


    public class PersistentNumber {
    public int getPersistence(int n) {
    int nPersist = 0;
    while (n >= 10) {
    int tmp = n % 10;
    n = n / 10;
    while( n > 0 ){
    tmp *= n % 10;
    n = n / 10;
    System.out.println(tmp);
    }
    nPersist++;
    n = tmp;
    }
    return nPersist;
    }
    }


    次に、nを書き換えるかわりに別の変数mを使ってみる


    public class PersistentNumber {
    public int getPersistence(int n) {
    int nPersist = 0;
    while (n >= 10) {
    int tmp = n % 10;
    int m = n / 10;
    while( m > 0 ){
    tmp *= m % 10;
    m = m / 10;
    System.out.println(tmp);
    }
    nPersist++;
    n = tmp;
    }
    return nPersist;
    }
    }

    mに関するwhileはforにできる。(mのスコープがforの中に閉じ込められてさらに便利)

    public class PersistentNumber {
    public int getPersistence(int n) {
    int nPersist = 0;
    while (n >= 10) {
    int tmp = n % 10;
    for (int m = n / 10; m > 0; m = m / 10) {
    tmp *= m % 10;
    System.out.println(tmp);
    }
    nPersist++;
    n = tmp;
    }
    return nPersist;
    }
    }


    (なんとなく投稿したらインデントが消えてしまいそうな予感・・)

    返信削除
  2. そうか、while( n>=10 )で判別すればよいのか。
    本当にインデントが消えてしまっていた...

    返信削除

フォロワー

ブログ アーカイブ

ページビューの合計