判断是否是质数?
本人比较笨拙是这么写的
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的情况,难道是我循环嵌套太多了?
求高手赐教
本人比较笨拙是这么写的
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的情况,难道是我循环嵌套太多了?
求高手赐教
------------ 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
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
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
而且在while里不能直接返回,如果直接返回的话,算法根本就没执行完整。
必须把2-@num的每个数字除一次才能判断
求解ing
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