如果我有一个数字X,并且想说IsPrime(X) = true/false使用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
正如您所说,您可以拥有一个表格,其中存储着最多1000万个素数。然后,查找一个数字是否为质数将是微不足道的。然后的问题是哪种方法会更快。我怀疑桌子会快很多(我还没有测试过这个说法)。
同样在这里。提供了一些解决方案。
解决方案0
这是通过使用Transact-SQL函数查找素数的一种解决方案:
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
这是通过使用一个select语句查找素数或非素数的另一种解决方案?其他评论中也有更多信息。
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