X遇到一个关于素数的问题需要你这位大牛帮他解决。素数(prime number)又称质数。一个大于1的自然数,除了1和它本身外,不能整除以其他自然数,换句话说就是该数除了1和它本身以外不再有其他的因数,否则称为合数。哥德巴赫是德国数学家。出生于格奥尼格斯别尔格(现名加里宁城)。曾在英国牛津大学学习。原学法学,由于在欧洲各国访问期间结识了贝努利家族,所以对数学研究产生了兴趣。曾担任中学教师。1725年,到了俄国,同年被选为彼得堡科学院院士。1725年~1740年担任彼得堡科学院会议秘书。1742年,移居莫斯科,并在俄国外交部任职。1742年,哥德巴赫在教学中发现,每个不小于6的偶数都是两个素数之和。如6=3+3,14=3+11等等。公元1742年6月7日哥德巴赫写信给当时的大数学家欧拉,欧拉在6月30日给他的回信中说,他相信这个猜想是正确的,但他不能证明。叙述如此简单的问题,连欧拉这样首屈一指的数学家都不能证明,这个猜想便引起了许多数学家的注意。我们不需要你去证明哥德巴赫猜想。我们假设哥德巴赫猜想是正确的,一个不小于6的偶数,都是两个素数之和。例如14=3+11,也可以表示为14=7+7。现在的问题是给定一个正整数N,求N是最少几个素数的和。。
输入格式:
首先输入一个正整数N,代表测试数据的组数,接下来输入N个正整数,分别代表要处理的数,每组一个正整数满足在:6 ~ 1000000000 范围。。
输出格式:
输出将会有N行,每行对应一个数的歌德巴赫最新猜想这个数时候需要的最少素数个数。。
输入样例:
在这里给出一组输入。例如:
2
9
11
输出样例:
在这里给出相应的输出。例如:
2
1
ac
#include<iostream>
#include<cmath>
using namespace std;
bool judge(int n);
int main() {
int n,t;
cin>>n;
while(n--) {
cin>>t;
if(t%2==0) {
cout<<2<<endl;
} else if(judge(t)) {
cout<<1<<endl;
} else {
if(judge(t-2)) {
cout<<2<<endl;
} else cout<<3<<endl;
}
}
return 0;
}
bool judge(int n) {
int i;
for(i=2; i<=sqrt(n); i++) {
if(n%i==0)return false;
}
return true;
}
运行超时:
#include<iostream>
#include<cmath>
using namespace std;
bool judge(int n);
int main(){
int n,i,t;
cin>>n;
int num;
int re;
while(n--){
num=0;
re=0;
cin>>t;
if(t%2==0){
cout<<2<<endl;
}
else if(judge(t)){
cout<<1<<endl;
}
else {
for(i=t-1;i>0;i--){
while(judge(i)){
num++;
re+=i;
i=t-re;
if(re==t)break;
}
i--;
if(re==t)break;
}
cout<<num<<endl;
}
}
return 0;
}
bool judge(int n){
int i;
for(i=2;i<=sqrt(n);i++){
if(n%i==0)return false;
}
return true;
}