如果我有一个数字X,并想使用sql-server说IsPrime(X)= true / false,最好的方法是什么?
我只是导入一个素数表还是有一个算法对于较小的素数是相当有效的?
注意:我对大于约的数字不感兴趣.千万.
结束使用以下内容:
CREATE FUNCTION [dbo].[isPrime] ( @number INT ) RETURNS VARCHAR(10) BEGIN DECLARE @retVal VARCHAR(10) = 'TRUE'; DECLARE @x INT = 1; DECLARE @y INT = 0; WHILE (@x <= @number ) BEGIN IF (( @number % @x) = 0 ) BEGIN SET @y = @y + 1; END IF (@y > 2 ) BEGIN SET @retVal = 'FALSE' BREAK END SET @x = @x + 1 END RETURN @retVal END
解决方法
正如你所说,你可以有一张
stores all the primes up to 10 million的表格.然后查看一个数字是否为素数是微不足道的.那么问题是哪种方法会更快.我怀疑桌子会快得多(我没有测试过这个说法).
Prime Table解决方案
> https://www.simple-talk.com/sql/t-sql-programming/celkos-summer-sql-stumpers-prime-numbers/提供一些解决方案,评论中还有更多.
> http://sqlblog.com/blogs/hugo_kornelis/archive/2006/09/23/Prime-numbers.aspx
同样在这里.提供了一些解决方案.
解决方案0
这是Finding prime numbers with a Transact-SQL function的一个解决方案:
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO –- ============================================= –- Author: Nicolas Verhaeghe –- Create date: 12/14/2008 –- Description: Determines if a given integer is a prime /* SELECT dbo.IsPrime(1) SELECT dbo.IsPrime(9) SELECT dbo.IsPrime(7867) */ –- ============================================= CREATE FUNCTION [dbo].[isPrime] ( @NumberToTest int ) RETURNS bit AS BEGIN -– Declare the return variable here DECLARE @IsPrime bit,@Divider int –- To speed things up,we will only attempt dividing by odd numbers –- We first take care of all evens,except 2 IF (@NumberToTest % 2 = 0 AND @NumberToTest > 2) SET @IsPrime = 0 ELSE SET @IsPrime = 1 –- By default,declare the number a prime –- We then use a loop to attempt to disprove the number is a prime SET @Divider = 3 -– Start with the first odd superior to 1 –- We loop up through the odds until the square root of the number to test –- or until we disprove the number is a prime WHILE (@Divider <= floor(sqrt(@NumberToTest))) AND (@IsPrime = 1) BEGIN –- Simply use a modulo IF @NumberToTest % @Divider = 0 SET @IsPrime = 0 –- We only consider odds,therefore the step is 2 SET @Divider = @Divider + 2 END –- Return the result of the function RETURN @IsPrime END
解决方案1
这是通过how to find whether is a prime or non prime with one select statement?的另一个解决方案.其他评论中还有更多信息.
CREATE FUNCTION isPrime ( @number INT ) RETURNS VARCHAR(10) BEGIN DECLARE @prime_or_notPrime INT DECLARE @counter INT DECLARE @retVal VARCHAR(10) SET @retVal = 'FALSE' SET @prime_or_notPrime = 1 SET @counter = 2 WHILE (@counter <= @number/2 ) BEGIN IF (( @number % @counter) = 0 ) BEGIN set @prime_or_notPrime = 0 BREAK END IF (@prime_or_notPrime = 1 ) BEGIN SET @retVal = 'TRUE' END SET @counter = @counter + 1 END return @retVal END