当前位置: 首页 > news >正文

快速求出质数

要快速判断一个数是否为质数,可以采用以下优化后的试除法,结合数学规律大幅减少计算量:

步骤说明

  1. 处理特殊情况

    • 若 ( n \leq 1 ),不是质数。
    • 若 ( n = 2 ) 或 ( n = 3 ),是质数。
    • 若 ( n ) 能被 2 或 3 整除,不是质数。
  2. 优化试除范围

    • 所有质数(除 2 和 3)都可表示为 ( 6k \pm 1 ) 的形式。
    • 只需检查 ( 5 ) 到 ( \sqrt{n} ) 之间的 ( 6k \pm 1 ) 的数。
  3. 循环检查

    • 以 6 为步长,每次检查 ( i ) 和 ( i+2 ) 是否能整除 ( n )。

C++ 代码实现

#include <iostream>
#include <cmath>

using namespace std;

bool is_prime(int n) {
    if (n <= 1) return false;       // 小于等于1的数不是质数
    if (n <= 3) return true;        // 2和3是质数
    if (n % 2 == 0 || n % 3 == 0)  // 排除能被2或3整除的数
        return false;
    
    // 检查形如6k±1的数,直到i超过sqrt(n)
    for (int i = 5; i * i <= n; i += 6) {
        if (n % i == 0 || n % (i + 2) == 0)
            return false;
    }
    return true;
}

int main() {
    int num;
    cout << "输入一个整数: ";
    cin >> num;
    
    if (is_prime(num))
        cout << num << " 是质数" << endl;
    else
        cout << num << " 不是质数" << endl;
    
    return 0;
}

复杂度分析

  • 时间复杂度:( O(\sqrt{n}) ),但实际运行次数比普通试除法减少约 3 倍。
  • 空间复杂度:( O(1) ),仅需常数空间。

优化原理

  1. 减少除数范围:通过数学推导,质数必定出现在 ( 6k \pm 1 ) 的序列中,避免检查不必要的数。
  2. 提前终止条件:当 ( i^2 > n ) 时停止循环,确保只检查到 ( \sqrt{n} )。
  3. 快速排除偶数:先处理 2 和 3 的倍数,直接跳过后续循环。

示例测试

  • 输入:7 → 输出:是质数
  • 输入:25 → 输出:不是质数(5×5)
  • 输入:997 → 输出:是质数(大质数)
  • 输入:1000001 → 输出:不是质数(101×9901)

这种方法结合数学规律和代码优化,能高效处理大多数情况下的质数判断需求。对于极大数(如加密用的大质数),可进一步使用概率性算法如 米勒-拉宾素性测试 进行更快速判断。

相关文章:

  • 【算法训练】单向链表
  • pandas中新增的case_when()方法
  • c++ 命名空间 namespace
  • 【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的数据验证:使用 Hibernate Validator
  • 数据建模流程: 概念模型>>逻辑模型>>物理模型
  • NSSCTF(MISC)——[NSSRound#4 SWPU]Type Message
  • 网络爬虫-2:基础与理论
  • 论文阅读笔记:Denoising Diffusion Probabilistic Models (3)
  • C语言中*a与a的区别和联系
  • 数据结构——B树、B+树、哈夫曼树
  • 安全测试理论
  • JavaScript 性能优化实战
  • 【云馨AI-大模型】自动化部署Dify 1.1.2,无需科学上网,Linux环境轻松实现,附Docker离线安装等
  • 【C++教程】setw()函数的使用方法
  • 深入理解Linux中的SCP命令:使用与原理
  • Hutool中的相关类型转换
  • 山东大学数据结构课程设计
  • linux--时区查看和修改
  • 动态规划-01背包
  • 牛客网【模板】二维差分(详解)c++
  • “面具女孩”多次恐吓电梯内两幼童,当事女孩及家长道歉后获谅解
  • 辽宁辽阳市白塔区一饭店火灾事故举行新闻发布会,现场为遇难者默哀
  • 神十九飞船已撤离空间站,计划于今日中午返回东风着陆场
  • “自己生病却让别人吃药”——抹黑中国经济解决不了美国自身问题
  • 央行回应美债波动:单一市场、单一资产变动对我国外储影响总体有限
  • 伊朗南部港口火势蔓延,部分集装箱再次发生爆炸