标签:
题目:
Description
Input
Output
Sample Input
6 10 12 0
Sample Output
1 2 1
这个题目是问1个数n可以有多少种方法表示成2个素数的和,n=p1+p2且p1<=p2
除了n=4的情况,p1和p2肯定是2个奇素数。
代码:
#include<iostream> using namespace std; int prime[32768]; int num[32768]; void get_prime() { for (int i = 0; i < 32768; i++)prime[i] = 1; for (int i = 2; i < 32768; i++)if(prime[i]) for (int j = i + i; j < 32768; j += i)prime[j] = 0; } int main() { get_prime(); for (int n = 4; n < 32768; n+=2) { int sum = (n == 4); for (int i = 3; i <= n / 2; i += 2)if (prime[i] && prime[n - i])sum++; num[n] = sum; } int n; while (scanf("%d",&n)) { if (n == 0)break; printf("%d\n", num[n]); } return 0; }
prime存1或者0,prime[i]=(isprime(i));
get_prime是利用筛法给prime进行初始化。
筛法的效率很高,接近线性时间。
上面的代码是436ms AC,我觉得还得优化。
主要就是num的初始化是θ(n^2)的,所以比较慢。
于是我发现,num的初始化也可以用类似筛法的方法!
改进之后只花了78ms
代码:
#include<iostream> using namespace std; int prime[32768]; int num[32768]; void get_prime() { for (int i = 0; i < 32768; i++)prime[i] = 1; for (int i = 2; i < 32768; i++)if(prime[i]) for (int j = i + i; j < 32768; j += i)prime[j] = 0; } int main() { get_prime(); for (int i = 4; i < 32768; i += 2)num[i] = 0; for (int i = 3; i < 32768; i+=2) { if (prime[i] == 0)continue; for (int j = i; i + j < 32768; j += 2)if (prime[j])num[i + j]++; } int n; while (scanf("%d",&n)) { if (n == 0)break; printf("%d\n", num[n]); } return 0; }
HDU - 1397 Goldbach's Conjecture(哥德巴赫猜想)
标签:
原文地址:http://blog.csdn.net/nameofcsdn/article/details/52277433