7-3 验证“哥德巴赫猜想” (10 分)

本文介绍了一个基于哥德巴赫猜想的程序设计实验,该程序能够在输入一个特定范围内的偶数时,验证其是否可以被分解为两个素数之和,并输出满足条件的素数对。程序通过优化的素数判断算法提高了运行效率。

数学领域著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数。本实验的任务是设计一个程序,验证20亿以内的偶数都可以分解成两个素数之和。
输入格式:
输入在一行中给出一个(2, 2 000 000 000]范围内的偶数N。
输出格式:
在一行中按照格式“N = p + q”输出N的素数分解,其中p ≤ q均为素数。又因为这样的分解不唯一(例如24还可以分解为7+17),要求必须输出所有解中p最小的解。
输入样例:
24
输出样例:
24 = 5 + 19

#include<stdio.h>
#include <math.h>
int lpl(int n);
int main()
{
  int a;
  scanf("%d",&a);
  int i;
  for(i=2;i<a;i++)
  {
    if(lpl(i)==0&&lpl(a-i)==0)
    {
        printf("%d = %d + %d",a,i,a-i);
        break;
    }
    else
    continue;
  }
  return 0;
}
int lpl(int n)
{
  if(n==2)return 0;
  int d;
  for(d=2;d<sqrt(n); d++)//使用sqrt()提高效率;
  {
    if(n%d==0){
        break;
    }
  }
  if(n%d==0)
    return 1;
  else
    return 0;
}

哥德巴赫猜想指出,任何一个大于2的偶数,都可以表示为两个素数之和。下面提供几种不同实现方式的C++代码来验证该猜想: ### 实现方式一 该代码可以输入一个大于2的偶数,验证其是否符合哥德巴赫猜想,并找出一种法输出。 ```cpp #include <iostream> using namespace std; // 判断一个数是否是质数 bool isPrime(int num) { if (num < 2) { return false; } for (int i = 2; i * i <= num; i++) { if (num % i == 0) { return false; } } return true; } // 打印满足哥德巴赫猜想的两个质数 void printGoldbachConjecture(int n) { if (n % 2 != 0 || n <= 2) { cout << "Invalid input!" << endl; return; } for (int i = 2; i <= n / 2; i++) { if (isPrime(i) && isPrime(n - i)) { cout << n << " = " << i << " + " << n - i << endl; return; } } cout << "Goldbach conjecture is false for " << n << endl; } int main() { int n; cout << "Enter an even number greater than 2: "; cin >> n; printGoldbachConjecture(n); return 0; } ``` ### 实现方式二 此代码可以输入一个大于2的偶数范围,验证该范围内的所有偶数是否符合哥德巴赫猜想,并输出所有满足第二个加数大于等于第一个加数的方案。 ```cpp #include<iostream> using namespace std; bool Prime(int i) { // 判断是否为质数的函数 int j; if (i <= 1) return 0; // 如果小于等于1返回0 if (i == 2) return 1; // 如果是2,返回1 for (j = 2; j < i; j++) { // 循环遍历判断是否为质数 if (i % j == 0) return 0; else if (i != j + 1) continue; else return 1; } } int main() { long i, j, k, flag1, flag2, n = 0; int a, b; cout << "请输入要验证的偶数范围,即输入两个正偶数:"; cin >> a >> b; int min = a <= b ? a : b; // 求较小的数 int max = a >= b ? a : b; // 求较大的数 for (i = min; i <= max; i += 2) { // 偶数相加 for (k = 2; k <= i / 2; k++) { // 根据鸽笼定理,将偶数为两部 j = i - k; // 另一部 flag1 = Prime(k); if (flag1) { // 如果k为质数 flag2 = Prime(j); if (flag2) { // j也为质数 cout << i << " = " << j << " + " << k << " "; n++; if (n % 5 == 0) cout << endl; // 每5个换行 } } } } if (n == (max - min) / 2 + 1) cout << "哥德巴赫猜想正确!"; // 如果个数满足要求输出猜想正确 system("pause"); return 0; } ``` ### 实现方式三 这段代码输入一个偶数,找出一种满足哥德巴赫猜想法并输出。 ```cpp #include<iostream> #include <iomanip> using namespace std; int sushu(int a) { if (a == 1) return 0; for (int i = 2; i < a; i++) { if (a % i == 0) return 0; } return 1; /*是素数*/ } int main() { int a, b; cin >> a; b = a; for (; a > 4; a--) { if (sushu(a) && sushu(b - a)) { cout << b - a << " " << a; break; } } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值