關於oj問題時間超時(Time Limit Error)的解決
阿新 • • 發佈:2019-02-13
孿生素數問題
時間限制:3000 ms | 記憶體限制:65535 KB
難度:3
描述
寫一個程式,找出給出素數範圍內的所有孿生素數的組數。一般來說,孿生素數就是指兩個素數距離為2,近的不能再近的相鄰素數。有些童鞋一看到題就開始寫程式,不仔細看題,咱們為了遏制一下讀題不認真仔細的童鞋,規定,兩個素數相鄰為1的也成為孿生素數。
輸入
第一行給出N(0
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int a[1000000];
int b[1000000];
int main()
{
int T,i,j;
memset(a,-1,sizeof(a));
memset(b,0,sizeof(b));
for(i=2;i<=1000000;i++) //把1到10000000的素數都列出來
{
if(a[i])
{
for(j=2*i; j<=1000000; j+=i)
a[j]=0;
}
}
b[3]=1; //表示3以內的素陣列為1組
for(i=4;i<=1000000;i++)
{
if (a[i]&&a[i-2]) //直接判斷a[i]與a[i-2]即可,因為相差1距離的孿生素數對只有2和3,上面已經考慮到了
{
b[i]=b[i-1]+1;
}
else
{
b[i]=b[i-1];
}
}
cin>>T;
while(T--)
{
int n;
scanf("%d",&n);
printf("%d\n",b[n]); //輸出n以內的孿生素數對
}
}
此當時間超時的解決方法;
先在main函式中,遍歷1000000以內的孿生素數對,這樣可以提交時間效率,以空間換時間。
如果通過呼叫函式的話,呼叫次數多了,時間效率就會降低。