首页 > 学院 > 开发设计 > 正文

文章标题

2019-11-08 18:43:26
字体:
来源:转载
供稿:网友

Goldbach’s conjecture is one of the oldest unsolved PRoblems in number theory and in all of mathematics. It states:

Every even integer, greater than 2, can be expressed as the sum of two primes [1].

Now your task is to check whether this conjecture holds for integers up to 107.

Input

Input starts with an integer T (≤ 300), denoting the number of test cases.

Each case starts with a line containing an integer n (4 ≤ n ≤ 107, n is even).

Output

For each case, print the case number and the number of ways you can express n as sum of two primes. To be more specific, we want to find the number of (a, b) where

1) Both a and b are prime 2) a + b = n 3) a ≤ b

Sample Input

2 6 4

Sample Output

Case 1: 1 Case 2: 1

Hint

An integer is said to be prime, if it is divisible by exactly two different integers. First few primes are 2, 3, 5, 7, 11, 13, …

解题报告

先得对107 内的素数打表只有664580个,如此数据量级就减小了100倍

判断素数a+b=n,只要取素数a,在判断 n-a 是否为素数即可复杂度o(φ(n))

#include<stdio.h>#include<algorithm>#define MAX_N 10000020#define P_N 664580using namespace std;bool vis[MAX_N];int p[P_N];void init(){ int cnt=0; for(int i=2;i*i<=MAX_N;i++) if(!vis[i]) for(int k=i*i;k<MAX_N;k+=i) vis[k]=true; for(int i=2;i<MAX_N;i++) if(!vis[i]) p[cnt++]=i;}int main(){ init();int T; scanf("%d",&T); for(int t=1;t<=T;t++){ int n; scanf("%d",&n); int ans=0; for(int i=0;p[i]<=n/2;i++){ if(!vis[n-p[i]]) ans++; } printf("Case %d: %d/n",t,ans); } return 0;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表