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 ;
这里的关键修改点:
- 把@i的声明和初始化移到外层循环内部,确保每次检查新的j时,@i都从2开始重新遍历。
- 内层循环只遍历到
SQRT(@j),大幅提升判断效率,尤其找大量素数的时候效果明显。 - 新增
@primeCount变量来计数,确保我们能准确找到前1000个素数,而不是限定j的范围。 - 调整素数判断逻辑:从2到平方根都没找到能整除的数,就说明是素数,用
@COUNT=0来判断,更合理高效。
内容的提问来源于stack exchange,提问作者Digant Jani
相关产品推荐
相关产品推荐

