sql >> データベース >  >> RDS >> Sqlserver

SQL Prime 数値関数

    あなたが言ったように、1,000 万までのすべての素数を格納する テーブルを持つことができます .その場合、数値が素数かどうかを調べるのは簡単です。問題は、どの方法がより高速かということです。テーブルの方がはるかに高速であると思います (この主張はテストしていません)。

    プライム テーブル ソリューション

    SQL 関数のソリューション

    ソリューション 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

    による別の解決策を次に示します。 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
    


    1. Oracle Data Access FileNotFound:Oracle.DataAccess.Common.Configuration.Section.xsd

    2. SQLで複合主キーを参照する方法

    3. mysql:特定のデータベースへの開いているすべての接続を表示しますか?

    4. 一意のフィールドがないテーブルに行がまだ存在しない場合は、mysqlを挿入します