私は最近、私の学校で小さなJavaプログラミングコンテストに参加しました。私のパートナーと私は最初の純粋なoopクラスを終えたばかりで、ほとんどの質問は私たちのリーグから外れていたので、これに落ち着きました(そして私は多少言い換えています):「入力整数nが与えられた場合、プライムである次のintを返しますその逆も素数です。たとえば、n = 18の場合、31と13は両方とも素数であるため、プログラムは31"を出力する必要があります。.classファイルには、1〜2,000,000,000のすべての可能な数値のテストケースが渡され、有効と見なされるには10秒以内に正解を返す必要がありました。
解決策を見つけましたが、テストケースが大きい場合は、10秒以上かかります。ループの範囲をn、.. 2,000,000,000から下に移動する方法があると確信しています。これは、nが小さい場合にループする必要がある可能性が低いためですが、どちらの方法でも、数値が小さい場合はループを解除します。両方の条件下で素数が見つかります。最初は2、.. nからループしていましたが、それがどれほど大きくても、nの平方根にのみループするという規則を思い出しました。私のプログラムをより効率的にする方法について何か提案はありますか?アルゴリズムの複雑さの分析を扱うクラスはありませんでした。これが私たちの試みです。
public class P3
{
public static void main(String[] args){
long loop = 2000000000;
long n = Integer.parseInt(args[0]);
for(long i = n; i<loop; i++)
{
String s = i +"";
String r = "";
for(int j = s.length()-1; j>=0; j--)
r = r + s.charAt(j);
if(prime(i) && prime(Long.parseLong(r)))
{
System.out.println(i);
break;
}
}
System.out.println("#");
}
public static boolean prime(long p){
for(int i = 2; i<(int)Math.sqrt(p); i++)
{
if(p%i==0)
return false;
}
return true;
}
}
コードのフォーマットを間違えた場合は申し訳ありませんが、ここに投稿するのはこれが初めてです。また、出力には各行の後に「#」が必要でした。これは、ループの後の行が何であるかを示しています。皆さんが提供してくれた助けに感謝します!!!