题目大意:将T个正整数N拆成若干个素数之和,最小化素数个数。
Time Limit:1000MS Memory
Limit:65536KB 64bit IO Format:%I64d
& %I64u
数据规模:0<=T<=20,2<=N<=10^9。
理论基础:哥德巴赫猜想:任一大于2的偶数,都可表示成两个素数之和。大于等于7的奇数都可以表示成三个质数之和。
题目分析:唉,这理论一摆出来,我都无话可说了,自己想吧。(虽然没完全证明,可是在数据规模内尚无反例。嘎嘎、、、)
代码如下:
#include<iostream> #include<cstdio> using namespace std; typedef long long LL; typedef long unsigned LU; bool isprime(int x) { for(int i=2;i*i<=x;i++) { if(x%i==0)return false; } return true; } int main() { int T; scanf("%d\n",&T); while(T--) { int n,k; scanf("%d",&n); if(isprime(n)) { printf("%d\n",n); continue; } if(n%2==0) { k=n-3; while(!(isprime(k)&&isprime(n-k)))k-=2; printf("%d %d\n",n-k,k); } else { int k=n-2; if(isprime(k)) { printf("2 %d\n",k); continue; } k-=2; while(!isprime(k))k-=2; printf("%d ",k); n=n-k; if(n==4) { printf("2 2\n"); continue; } k=n-3; while(!(isprime(k)&&isprime(n-k)))k-=2; printf("%d %d\n",k,n-k); } } return 0; }其中,减三和减二是因为素数肯定是奇数(2除外)。
参考文献:
http://zh.wikipedia.org/wiki/%E5%93%A5%E5%BE%B7%E5%B7%B4%E8%B5%AB%E7%8C%9C%E6%83%B3
by:Jsun_moon http://blog.csdn.net/Jsun_moon
作者:u011629906 发表于2013-8-10 23:54:08 原文链接
阅读:107 评论:0 查看评论