判断是否是质数?
本人比较笨拙是这么写的
create function judegePrime(@num int)returns char(5)
as
begin
 declare @result char(5)
if(@num<2)
set @result='Error'
else if(@num=2)
set @result='YES' 
else if(@num>2)
begin
declare @a int
set @a=2
while(@a<@num+1)
begin
if(@num%@a=0)
begin
set @result='Yes'
                    set @a=@a+1
end
else if(@num%@a<>0)
set @result='No'
end
end
return @result
end但是执行select dbo.judegePrime(n)的时候总是耗时太长,除了<=2的情况,难道是我循环嵌套太多了?
求高手赐教

解决方案 »

  1.   


    ------------ 100以内的素数
    SELECT p.n
    FROM dbo.Nums p
    WHERE p.n BETWEEN 2 AND 100
        AND NOT EXISTS (
            SELECT * FROM dbo.Nums f
            WHERE f.n BETWEEN 2 AND p.n - 1
                AND p.n % f.n = 0)------------ 100以内的素数
    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------------ 100以内的素数
    declare @input int
    set @input = 100  -- 求100以内的素数
    select A.number from master..spt_values A
    where type='P' and number between 2 and @input
    and not exists(select 1 from master..spt_values B
                    where B.type='P' 
                     and B.number between 2 and sqrt(A.number)
                     and  A.number % B.number =0
                   )
    order by A.number
      

  2.   

    create function judegePrime(@num int)returns char(5)
    as
    begin
    if(@num<2)
    Return 'Error' --直接返回。
    else if(@num=2)
    Return 'Yes' --直接返回
    else if(@num>2)
    begin
    declare @a int
    set @a=2
    while(@a<@num+1)
    begin
    if(@num%@a=0)
    begin 
    retrun 'Yes' --已出结果,直接返回
      set @a=@a+1
    end
    else if(@num%@a<>0)
    return 'No'
    end 
    end
    end
      

  3.   

    方法:create function judegePrime(@num int)
    returns bit as
    begindeclare @i int
    set @i = 2while @i < sqrt(@num)
    begin
    if @num % @i = 0 return 0
    set @i = @i + 1
    endreturn 1end
      

  4.   

    其它需求比如返回值、@num范围判断等,自己另行改写。
      

  5.   


       而且在while里不能直接返回,如果直接返回的话,算法根本就没执行完整。
      必须把2-@num的每个数字除一次才能判断
      

  6.   

    up               
    求解ing   
      

  7.   

    是你的設計本身有問題,我只是告訴你中途可以返回,下面的語句不必再運行。下面是我給你改了後的,運行時間幾乎可不計,6位數也可立即看到結果。
    create function judegePrime
    (@num int)
    returns varchar(5)
    as
    begin
    declare  @i int,@Yes varchar(5)
    if(@num<2)
           return 'Error'
         else begin
    set @i=2
    set @Yes='Yes'
    while(@i<=@num/2) and @Yes='Yes'
    begin
    if(@num%@i=0)
    set @Yes='No'
       set @i=@i+1
    end

    end
    return @Yes
    end
    go