2877讲解

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2877讲解
歌德巴赫猜想:
歌德巴赫猜想,是指对于每一个大于4的偶数n,都能表示成两个质 数之和。现在,你需要写程序验证这一猜想。对于n,找出质数a和b, 满足 a+b=n, a≤b,且a*b最大。例如n=8,满足条件的a和b分别为3和5; 又如n=10,质数3、7以及5、5满足a+b=n, a≤b,而乘积大的那组是5、 5。
//找到质数
//找到乘积最大质数对 //输出该质数对
2877讲解
• 找到乘积最大质数对函数 int Goldbach(int num,bool primes[]) { int i; for(i=(num-2)/4;i>0;i--) { if(primes[i] wenku.baidu.com& primes[(num-(i*2+1))/2]) return i*2+1; } return 2; }
//
初始化
//
检查该奇数是否是质数 //如果不是,对其赋值false
2877讲解
• 主函数 #include <iostream> using namespace std; bool* GeneratePrimes(int n); int Goldbach(int num,bool primes[]); int main() { bool* primes; primes = GeneratePrimes(20000); int num; int p; while(cin>>num) { if(num<=4) break; p = Goldbach(num,primes); cout << p << ‘ ’ << num-p << endl; } return 1; }
2877讲解
• 定义一个判定质数的函数,返回布尔型数组指针
bool* GeneratePrimes(int n) { bool* primes = new bool[n/2+1]; int i; int k,p; for(i=0;i<n/2+1;i++) { primes[i] = true; } for(i=1;i<n/2;i++) { if(primes[i]) { p = i*2+1; for(k=i+1;k<n/2+1;k++) { if(!primes[k]) continue; if((k*2+1)%p==0) { primes[k] = false; } } } } return primes; }
2877讲解
• 输入
一个偶数n(4<n<20000)
• 思路
要使a*b最大,必须要让|a-b|最小。因此,可以先将n拆成最接近的 两个奇数,判断两个奇数是否都是质数。如果否,再判断第二接近 的两个奇数,直到都是质数为止。 例如 14可拆成最接近的两个奇数是7+7,7为质数,所以既是结果; 而16拆成最接近的两个奇数是7+9,但9不是质数,因此第二接近的 奇数是5和11,且都是质数,所以结果是5和11。
//如果都是质数 //输出较小的
相关文档
最新文档