Time Limit: 2 second(s) | Memory Limit: 32 MB |
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 | Output for Sample Input |
2 6 4 | Case 1: 1 Case 2: 1 |
Note
1. 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, ...
题意:
一个数可以有多少种可能是由两个素数相加得到的。
解题思路:
哥德巴赫猜想,此题需要素数打表,还要注意打表后的判断方法,不能再采用普通的枚举算法,会超时。数组一定要开成bool型的,否则超内存。
AC代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <algorithm> using namespace std; int prime[700000]; bool is_prime[10000000]; int tot; void solve() { tot=0; is_prime[0]=is_prime[1]=1; for(int i=2;i<10000000;i++) if(!is_prime[i]){ prime[tot++]=i; for(int j=i*2;j<10000000;j+=i){ is_prime[j]=1; } } } int main() { solve(); int t; int xp=0; scanf("%d",&t); while(t--){ int n; scanf("%d",&n); int res=0; for(int i=0;prime[i]<=n/2;i++){ int j=n-prime[i]; if(!is_prime[j]) res++; } printf("Case %d: %d\n",++xp,res); } return 0; }