【华为od刷题(C++)】HJ60 查找组成一个偶数最接近的两个素数

我的代码:

#include //用于输入输出操作(例如 cin 和 cout)
#include //用于动态数组操作,存储可能的质数对
using namespace std;

//判断一个数字 x 是否是质数(素数)
//质数是指只能被 1 和它本身整除的数
bool isprime(int x) {
    for (int i = 2; i * i <= x; ++i) {
    /*只需要检查到 sqrt(x),
    因为如果一个数有因数,
    那么必定有一个因数小于等于它的平方根*/

        if (x % i == 0) {
            return false;
        }
    }
    return true;
}
int main() {
    int even;
    while (cin >> even) {//读取输入的偶数
        vector vec;
        for (int i = 2; i <= even / 2; ++i) {
            //从 2 开始遍历到 even / 2
            //(对称的情况,i 和 even - i 是一样的,所以只需遍历到一半)

            if (isprime(i) && isprime(even - i)) {
                vec.push_back(i);
            }
            /*如果 i 和 even - i 都是质数
            (通过 isprime(i) 和 isprime(even - i) 判断)
            就把 i 放入 vec 向量中*/
        }
        cout << vec.back() << endl << even - vec.back() << endl;
        /*vec.back() 取得 vec 中最后一个元素
        (因为 i 是从小到大增加的,
        所以 vec.back() 对应着最后找到的合适的质数 i)
        
        输出这个质数对和它的补数 even - vec.back()*/
    }
    return 0;
}

这个程序实现了判断给定偶数是否可以表示为两个质数之和的功能;代码的核心思路如下:

1. 判断质数的函数 (isprime)

  • 该函数用于判断一个数字 x 是否是质数;质数是指只能被 1 和其本身整除的自然数
  • 通过遍历从 2 到 sqrt(x) 的所有整数来检查 x 是否能被某个数整除;如果能整除,则说明 x 不是质数,返回 false;否则,返回 true

2. 主函数 (main)

  • 程序首先使用 cin 读取一个偶数 even
  • 通过遍历 i 从 2 到 even / 2,检查 i 和 even - i 是否都为质数;如果是,则将 i 存储到一个动态数组 vec 中
  • 最后输出 vec 中最后一个质数对(即最接近 even 的质数对);由于 i 是从小到大遍历的,因此 vec.back() 会得到最大的符合条件的质数对

3. 细节说明

  • 使用 vec.back() 输出找到的最大质数对,这样保证输出的是最大的一对质数
  • 该程序能够持续处理多个输入,直到输入结束
  • 通过只检查到 even / 2,避免了重复计算对称的情况,例如 (i, even - i) 和 (even - i, i) 是一样的

总结:

  • 这个程序的目标是找到两个质数,使得它们的和等于给定的偶数 even,并且返回最大的质数对;它利用了质数判断函数和遍历的方法来实现这一目标

你可能感兴趣的:(华为od,c++,开发语言)