酷代码 AI
菜单

题目描述 如果n和n+2都是素数,则称它们是孪生素数。输入m,输出两个数均不超过m的最大孪生素数。 例如 m = 20 m=20时答案是 17 、 19 17、19, m = 1000 m=1000时答案是 881 、 883 881、883。 输入 输入在一行中给出 M M, M M是一个不超过 1000000 1000000的正整数。 输出 不超过 m m的最大孪生素数,小数在前,大数在后,中间用一个空格分隔。

以下是实现该功能的 C++ 代码: ```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; } int main() { int m; cin >> m; int first = 0, second = 0; // 从 m-2 开始逆序遍历寻找最大孪生素数 for (int i = m - 2; i >= 2; i--) { if (isPrime(i) && isPrime(i + 2)) { first = i; second = i + 2; break; } } cout << first << " " << second << endl; return 0; } ``` 代码解释 1. `isPrime` 函数:该函数用于判断一个数是否为素数。素数是指大于 1 且只能被 1 和自身整除的正整数。对于小于 2 的数,直接返回 `false`;对于大于等于 2 的数,从 2 开始到该数的平方根进行遍历,如果能被其中任何一个数整除,则该数不是素数,返回 `false`,否则返回 `true`。 2. `main` 函数: - 首先读取输入的正整数 `m`,它表示查找孪生素数的上限。 - 定义两个变量 `first` 和 `second` 用于存储最大孪生素数对,初始化为 0。 - 从 `m - 2` 开始逆序遍历到 2,对于每个数 `i`,检查 `i` 和 `i + 2` 是否都是素数。如果是,则将 `i` 赋值给 `first`,`i + 2` 赋值给 `second`,并使用 `break` 语句跳出循环。因为是逆序遍历,所以找到的第一对孪生素数就是不超过 `m` 的最大孪生素数对。 - 最后输出找到的最大孪生素数对,小数在前,大数在后,中间用一个空格分隔。 这个代码的时间复杂度主要取决于 `isPrime` 函数的调用次数和每次调用的时间复杂度。在最坏情况下,对于每个数都需要调用 `isPrime` 函数,并且 `isPrime` 函数的时间复杂度为 $O(\sqrt{n})$,所以总的时间复杂度约为 $O(m\sqrt{m})$。 [2026-02-01 20:04:46 | AI问答 | 604点数解答]

服务商
相关提问
发财导航,免费问AI
实用工具查看更多