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.
InputInput 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).
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
2
6
4
Case 1: 1
Case 2: 1
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, ...
题意:让你找出两个素数相加等于n的对数
按照常规的思路是必须Memory Limit,,,所以我们就可以把数组写成bool型的,因为int是4个字节,bool是一个字节。
然后改完交,,理所当然的TLE。。。。。。再改。。。之后我们就想我们可以把第几个素数的用数组记录下来,10000000里内的素数的个数肯定是<10000000/2的。。这样我们在挨个询问素数的时候是不是时间就少了。这样就AC了
#include<stdio.h>
#include<string.h>
bool a[10000001];
int b[666666];
int p=0;
void we()
{
memset(a,false,sizeof(a));
a[0]=a[1]=true;
for(int i=2; i<=10000000; i++)
{
if(!a[i])
{
b[p++]=i;
for(int j=2*i; j<=10000000; j+=i)
a[j]=true;
}
}
}
int main()
{
we();
int t;
scanf("%d",&t);
int g=0;
while(t--)
{
++g;
int n;
scanf("%d",&n);
int sum=0;
for(int i=0; i<p; i++)
{
if(b[i]>=n/2+1)
break;
if(!a[n-b[i]]&&n>=2*b[i])
{
sum++;
}
}
printf("Case %d: %d\n",g,sum);
}
}