题解 | #判断质数#

判断质数

https://www.nowcoder.com/practice/9f418ff48b5e4e879f398352bed6118d

BGN41 判断质数

思路

题目很直白:给你一个正整数 ,判断它是不是质数,是的话输出 Yes,否则输出 No

那什么是质数?大于 1 的整数,且只能被 1 和自身整除。

怎么判断呢?最朴素的方法是从 2 遍历到 ,看有没有能整除 的数。但这样太慢了,有没有更快的办法?

试除法优化

关键观察:如果 有一个因子 ),那 也是 的因子。 这两个因子,至少有一个

所以我们只需要从 2 枚举到 就够了。如果在这个范围内没有找到任何因子, 就是质数。

注意数据范围

这道题有个小坑:输入数据可能超过 int 的范围(测试用例中出现了 274876858367 这样的大数)。所以 C++ 要用 long long,Java 要用 long

循环条件写成 i * i <= n 比调用 sqrt 更好,避免浮点精度问题。

代码

#include <iostream>
using namespace std;

int main() {
    long long n;
    cin >> n;
    if (n < 2) {
        cout << "No" << endl;
        return 0;
    }
    for (long long i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            cout << "No" << endl;
            return 0;
        }
    }
    cout << "Yes" << endl;
    return 0;
}
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long n = sc.nextLong();
        if (n < 2) {
            System.out.println("No");
            return;
        }
        for (long i = 2; i * i <= n; i++) {
            if (n % i == 0) {
                System.out.println("No");
                return;
            }
        }
        System.out.println("Yes");
    }
}
import math

n = int(input())
if n < 2:
    print("No")
else:
    is_prime = True
    for i in range(2, int(math.isqrt(n)) + 1):
        if n % i == 0:
            is_prime = False
            break
    print("Yes" if is_prime else "No")
const readline = require('readline');
const rl = readline.createInterface({ input: process.stdin });
const lines = [];
rl.on('line', line => lines.push(line));
rl.on('close', () => {
    const n = BigInt(lines[0].trim());
    if (n < 2n) {
        console.log("No");
        return;
    }
    let isPrime = true;
    for (let i = 2n; i * i <= n; i++) {
        if (n % i === 0n) {
            isPrime = false;
            break;
        }
    }
    console.log(isPrime ? "Yes" : "No");
});

复杂度分析

  • 时间复杂度,只需要枚举到
  • 空间复杂度,只用了几个变量。

总结

判断质数是最基础的数论问题之一。核心就是试除法——枚举到 就够了,不需要遍历到 。实际做题时容易忽略的点是数据范围,如果题目没有明确说范围在 int 内,用 long long / long 是更安全的选择。

全部评论

相关推荐

Rac000n:淘天-客户运营部-AI研发工程师,智能客服方向,暑期实习招聘,欢迎联系
点赞 评论 收藏
分享
Kurumis:整个简历看下来就发现你其实对测试理解还很浅,很多地方都是硬凑上去,项目也是学生课设级别,没什么含金量 首先是学习建议: 1.系统性了解一个真实工程的框架,有利于你后续提升项目含金量,理解测试的逻辑 2.真正去学一下自动化测试和性能测试 再就是简历本身包装问题: 1.投测试的话就不要说自己独立开发自己测,专注描述自己怎么做测试的 2.项目经历太像套话,很容易让人怀疑你到底真的做过没有,比如并发是具体做了多少并发?自动化脚本是怎么跑兼容性和性能测试的?测试用例写了多少条? 3.教务管理系统一听就是数据库课设作业,含金量不高,不过你可以在原项目基础上重构扩展,比如添加docker容器部署MySQL和Redis,添加消息队列和锁机制防止系统扛不住高并发访问,让它真的像个实际工程 4.技能里性能专项测试没有把握不要乱写,就写你会什么工具就行了,做专项性能测试的都是行业大佬,你要写的话一定要有对应的专项性能测试项目 5.可以在简历里附上项目链接,压缩简历内容的同时提升简历真实性
今天你投了哪些公司?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务