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

SQL Server求前1000个素数代码排查:仅输出2问题咨询

排查你的SQL Server素数程序问题

我仔细看了你的素数SQL代码,发现它只输出2的核心问题是变量@i没有在每次检查新的数时重置初始值,导致后续的数根本没被正确判断。咱们一步步拆解问题:

  • @i的初始化位置错了:你把@i初始化为1放在整个循环外面,第一次检查j=2的时候,@i从1跑到2,这时候能算出@COUNT=2(1和2都能整除2),所以会打印2。但当j增加到3时,@i已经是3了,内层循环直接从3开始,j%i=0,@COUNT变成1,循环结束后@COUNT不等于2,自然不会打印3。后面的j值同理,@i只会越来越大,内层循环根本不会遍历到能整除的小因数,也就判断不出素数了。

  • 素数判断的逻辑可以优化:原来的代码从1开始遍历到j本身,其实素数判断只需要检查到j的平方根就够了,而且1能整除所有数,完全不需要纳入判断,这会额外增加不必要的计算。

接下来给你修正后的代码,不仅能正确输出前1000个素数,还优化了效率:

DECLARE @j INT = 2 
DECLARE @COUNT INT 
DECLARE @primeCount INT = 0 -- 用来统计找到的素数数量,找够1000个就停止

BEGIN 
WHILE @primeCount < 1000 
BEGIN 
    SET @COUNT = 0 
    DECLARE @i INT = 2 -- 每次检查新数时,重置@i为2,从最小的因数开始判断
    WHILE @i <= SQRT(@j) -- 优化:只检查到j的平方根,减少循环次数
    BEGIN 
        IF((@j % @i) = 0) 
            SET @COUNT += 1 -- 找到能整除的因数,计数+1
        SET @i += 1 
    END 
    -- 因为从2开始检查到平方根都没找到因数,说明j是素数
    IF (@COUNT = 0) 
    BEGIN
        PRINT @j 
        SET @primeCount += 1 -- 找到素数,计数+1
    END 
    SET @j += 1 
END 
END ;

这里的关键修改点:

  1. 把@i的声明和初始化移到外层循环内部,确保每次检查新的j时,@i都从2开始重新遍历。
  2. 内层循环只遍历到SQRT(@j),大幅提升判断效率,尤其找大量素数的时候效果明显。
  3. 新增@primeCount变量来计数,确保我们能准确找到前1000个素数,而不是限定j的范围。
  4. 调整素数判断逻辑:从2到平方根都没找到能整除的数,就说明是素数,用@COUNT=0来判断,更合理高效。

内容的提问来源于stack exchange,提问作者Digant Jani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:57:58