1. 程式人生 > >關於oj問題時間超時(Time Limit Error)的解決

關於oj問題時間超時(Time Limit Error)的解決

孿生素數問題
時間限制: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以內的孿生素數對,這樣可以提交時間效率,以空間換時間。
如果通過呼叫函式的話,呼叫次數多了,時間效率就會降低。