好的第一件事是第一件事。是的,這個問題來自編程比賽。不,我不想欺騙,因爲比賽已經在4小時前結束了。我很確定我的代碼是正確的,但比賽的編譯器說它給出了錯誤的答案。我嘗試了其他編譯器,並說「超出時間限制」。尋找不超過時限的素數
因此,首先,您能否告訴我代碼是否正確? [一個編譯器說不是]
如果是,那我該如何讓它更省時? [另一個編譯器認爲很超過時限]
問題的數字被稱爲質數,如果它是大於1且 具有不超過1和本身以外的除數。前幾個素數 分別是2,3,5,7,11,13等等。給定一個整數X,找到 的最小素數不小於X
輸入:第一行包含測試用例T的個數T.T的情況如下 。每個測試用例由一個單獨的行中的整數X組成。
輸出:產量T線,一條用於容納最小 素數這是不小於X
約束每種情況下: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;
}
你試過在你的機器上運行這個嗎?也許編譯器報告錯誤實際上是你的程序運行時間太長(至少比挑戰造成的時間限制多)。 –
是的,我把它運行在我的電腦上,並嘗試過各種測試用例,如:-5,0,1,2,3,50所有這些數字都有正確的輸出。所提供的測試案例也像魅力一樣。 – user2732146
您應該使用緩存來查找已經遇到的主要值。它可能會加快這個過程。你也不需要檢查每個除數,只能達到sqrt(i) – lucasg