正如您所说,您可以拥有一个表格,其中存储着最多1000万个素数。然后,查找一个数字是否为质数将是微不足道的。然后的问题是哪种方法会更快。我怀疑桌子会快很多(我还没有测试过这个说法)。
同样在这里。提供了一些解决方案。
SQL函数解决方案解决方案0
这是通过使用Transact-SQL函数查找素数的一种解决方案:
SET ANSI_NULLS onGOSET QUOTED_IDENTIFIER ONGO–- =============================================–- Author: Nicolas Verhaeghe–- Create date: 12/14/2008–- Description: Determines if a given integer is a prime–- =============================================CREATE FUNCTION [dbo].[isPrime]( @NumberToTest int)RETURNS bitASBEGIN -–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 @IsPrimeEND
解决方案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 @retValEND
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)