0.是一道筛质数的题目。
1.一开始的暴力方法。
for(int a = 3; a <= n; a ++)
{
int b = n - a;
if(判断a,b是不是质数)
}
时间复杂度:O(n*T*根号n) 约等于 10^9。故不可取。
2.做法如下:
2.1 先预处理出来质数表。
2.2 外层循环枚举每一个质数a;
内层打表判断b=n-a是不是质数即可。
时间复杂度O(n * n/ln n * T)
code:
#include<iostream>#include<cstring>#include<algorithm>usingnamespace std;constint N =1000010;int primes[N], cnt;bool st[N];voidinit(int n){for(int i =2; i <= n; i ++){if(!st[i]) primes[cnt ++]= i;//如果当前这个元素没有被筛 说明该数是质数for(int j =0; primes[j]<= n / i; j ++){
st[primes[j]* i]=true;if(i % primes[j]==0)break;}}}intmain(){init(N -1);//初始化int n;while(cin >> n, n)//一直读入一个n, 当n为0时,停下来。{for(int i =1; i < cnt; i ++)//从小到大枚举a 因为是从小到达枚举的所以 保证了 解的差值最大。{int a = primes[i];int b = n - a;if(!st[b]){printf("%d = %d + %d\n", n, a, b);break;}}}return0;}