この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点。各桁の積をどのように定義するかというのが考えどころ。
まずは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;
}
}
(なんとなく投稿したらインデントが消えてしまいそうな予感・・)
そうか、while( n>=10 )で判別すればよいのか。
返信削除本当にインデントが消えてしまっていた...