さて、まず最初に。はい、この質問はプログラミング コンテストからのものです。いいえ、コンテストは 4 時間前に終了しているので、ごまかすつもりはありません。私のコードは正しいと確信していますが、コンテストのコンパイラは間違った答えを出していると言っていました。他のコンパイラを試してみたところ、「Time Limit Exceeded」と表示されました。
では、まず、コードが正しいかどうか教えていただけますか? [あるコンパイラはそうではないと言いました]
はいの場合、どうすれば時間をより効率的にすることができますか? [別の編集者は制限時間を超えていると言った]
問題 数が 1 より大きく、1 とそれ自体以外に約数がない場合、その数は素数と呼ばれます。最初の数個の素数は、2、3、5、7、11、13 などです。整数 X が与えられたとき、X より小さくない最小の素数を見つけます
入力: 最初の行には、テスト ケース T の数が含まれます。T ケースが続きます。各テスト ケースは、別の行の整数 X で構成されます。
出力: X 以上の最小の素数を含むケースごとに 1 つの T 行を出力します。
制約: 1 <= T <= 10 1 <= X <= 1,000,000
サンプル入力: 4 8 47 90 1130
サンプル出力: 11 47 97 1151
これが私の解決策です:
int main()
{
int n;
long int x, i, a;
bool isPrime; // This flag will test if number is prime or not?
cin>>n; // Here "n" will represent the number of test cases
while(n)
{
cin>>x; // "x" is the number to be tested for the nth case
if(x<=2)
{
cout<<2<<endl; // All numbers smaller than 3 will have the smallest prime number as 2.
continue;
}
for(i=x;i<=1000000;i++) // Should I have checked values of "i" for odd numbers only? I forgot to try that... Would it have helped in reducing time complexity?
{
isPrime=true;
for(a=2; a<i; a++) // Okay I tried making it (i/2)+1 but then the compiler said that it was a wrong answer. I am skeptical though...
{
if(i%a==0 and i!=2)
isPrime=false;
}
if(isPrime==true)
{
cout<<i<<endl;
break;
}
}
n--;
}
return 0;
}