-----------查询数据库素数的N种方法(包括C#的)--------------

最近在看C#方面的书,正好看到迭代器这块,里面有个查询素数的示例我觉得还不错,于是就想到SQL也来实现一把。大笑


其实有很多种方法,我大概列下下面。结果就只贴一个好了:


方法1: 最简单粗暴的算法

DECLARE @i INT ,
    @j INT ,
    @r INT
SET @i = 2
WHILE @i < 100 
    BEGIN
        SET @j = 1
        SET @r = 1

        WHILE @j < @i 
            BEGIN
                IF @i % @j = 0
                    AND @i <> @j
                    AND @j <> 1 
                    BEGIN
                        SET @r = 0
                        BREAK
                    END
                SET @j = @j + 1
            END
        IF @r = 1 
            PRINT @i
        SET @i = @i + 1
    END





方法二:来自叶子,用平方根计算,比方法1提升了一点效率


--定义一个表变量,用来存储找到的素数
DECLARE @t TABLE ( id INT )
DECLARE @i INT SET @i = 2
WHILE ( @i <= 100 ) 
    BEGIN
        DECLARE @j INT SET @j = SQRT(@i)
        WHILE ( @j >= 2 ) 
            BEGIN
                IF ( @i % @j = 0 ) BREAK SET @j = @j - 1
            END
        IF ( @j = 1 ) INSERT  INTO @t SELECT  @i
        SET @i = @i + 1
    END



方法三:


借助系统表 还是用平方根


DECLARE @i INT
SET @i = 100  

SELECT  A.number
FROM    master..spt_values AS A
WHERE   type = 'p'
        AND number BETWEEN 2 AND @i
        AND NOT EXISTS ( SELECT 1
                         FROM   master..spt_values AS B
                         WHERE  B.type = 'p'
                                AND B.number BETWEEN 2 AND SQRT(A.number)
                                AND A.number % B.number = 0 )
ORDER BY A.number






最后附上C#解决办法:用控制台程序解决


using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Ch11Ex03
{
    class Program
    {
        public class Primes
        {
            private long min;
            private long max;
            public Primes(): this(2, 100)
            {
            }
            public Primes(long minimum, long maximum)
            {
                if (min < 2)
                    min = 2;
                else
                    min = minimum;
                max = maximum;
            }
            public IEnumerator GetEnumerator()
            {
                for (long possiblePrime = min; possiblePrime <= max; possiblePrime++)
                {
                    bool isPrime = true;
                    for (long possibleFactor = 2; possibleFactor <= (long)Math.Floor(Math.Sqrt(possiblePrime)); possibleFactor++)
                    {
                        long remainderAfterDivision = possiblePrime % possibleFactor;
                        if (remainderAfterDivision == 0)
                        {
                            isPrime = false;
                            break;
                        }
                    }
                    if (isPrime)
                    {
                        yield return possiblePrime;
                    }
                }
            }
        }
        static void Main(string[] args)
        {
            Primes primesFrom2To100 = new Primes(2, 100);
            foreach (long i in primesFrom2To100)
                Console.Write("{0}\n", i);
            Console.ReadKey();
        }
    }
}






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值