このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文について、おおまかに説明する。
素数というのは、1よち大きい整数で、1とそれ以外で割り切れないものである。もしあるNに対してN-10からN+10にある数で割り切れない場合、その数Nは「素数から遠い」と考えられる。つまりN-10からN+10までの数はすべて素数でないということである。さて、AとBという二つの整数が与えられる。このとき、AとBの間にある「素数から遠い」数はいくつあるかを求めて返せ。なお、常にB>=Aの関係が成り立つものとする。
私の解答はこちら。
public class FarFromPrimes { public int count(int A, int B) { int nFarFromPrime = 0; for( int i=A ; i<=B ; i++ ){ boolean isFarFromPrime = true; for( int j=i-10 ; j<=i+10 ; j++ ){ boolean isOK = false; for( int k=2 ; k<=j/2 ; k++ ){ if( j % k == 0 ){ // 途中で素数でないと分かればOK isOK = true; break; } } if( isOK == false ){ // 素数でない数がi-10からi+10の間に存在した isFarFromPrime = false; break; } } if( isFarFromPrime == true ) nFarFromPrime++; // 全部素数ならカウント } return nFarFromPrime; } }
得点は183.67/250、中央値は約190点。ある数nが素数か否かの検討は本来ならsqrt(n)まで調べればよいはずなのですが、面倒なので、n/2まで調べる方針で対応しました。
0 件のコメント:
コメントを投稿