You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两种C++质数判断代码差异及sqrt优化逻辑必要性咨询

质数判断代码问题解答

首先你的第一版代码存在致命逻辑错误

你写的第一版代码并不能正确判断质数,问题出在循环的分支逻辑:

#include <iostream>
#include<cmath>
using namespace std;

int main()
{
   int n;
   cout << "Enter the no. and we will tell you whether it's Prime or Non-Prime \n";
   cin >> n;
   
   for (int i=2; i<n; i++) {
       if (n%i== 0){
           cout << "Non-Prime"<< endl;
           break;
       }
       else {
           cout << "Prime" << endl;
       } break;
   }

    return 0;
}

这里循环只要执行第一次(i=2时),要么匹配到整除输出非质数退出,要么直接输出质数就break,根本不会继续遍历后面的因数。比如输入9,9%2=1,代码会直接输出Prime,但9是3*3的合数,完全不符合预期。就算你删掉else分支里的break,也会出现每遍历一个不整除的i就输出一次Prime的问题,正确的逻辑应该是等所有可能的因数都遍历完,没有找到整除的情况再输出质数。

第二版代码的核心逻辑

第二版用到sqrt()的写法是基于质数的数学性质优化:
如果一个数n是合数,那么它一定存在至少一个小于等于√n的正因数。
原理很简单:假设n是合数,存在两个因数a和b满足n=a*b,如果a和b都大于√n,那么a*b就会大于√n*√n =n,和n=a*b矛盾。所以我们只需要遍历从2到√n的所有整数,就能确认n有没有除了1和自身之外的因数。
这个优化把原本遍历到n-1的O(n)时间复杂度,直接降到了O(√n),效率提升非常明显:比如判断1000003是不是质数,原来的写法要跑100万次循环,优化后的写法只需要跑1000次就能出结果。

这种优化写法有没有必要?

分场景看:

  • 如果你只是做入门练习,只需要判断1000以内的小数字,优化前后的运行差异你几乎感知不到,但前提是你得先把基础逻辑写对,不要出现第一版里提前break的低级错误。
  • 如果你要判断的数字大于1万,或者需要批量判断几十上百个数字的质数属性,这个优化就是必须的,能把原本可能要跑几秒的逻辑压缩到几毫秒就能完成。

内容的提问来源于stack exchange,提问作者Divanshu Garg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:15:03