用SQl语句求1-100内的素数~~~

mad2000 2010-08-05 08:47:54
用SQl循环语句求1-100内的素数~~~
...全文
3355 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
luoyoumou 2010-08-05
  • 打赏
  • 举报
回复
-- Oracle 版的:(修改成 SQL Server 相当容易)
CREATE OR REPLACE FUNCTION isSushu_fun(v_num NUMBER)
RETURN VARCHAR2
IS
v_seq NUMBER(18,0); -- 求出输入数的算术平方根加1,用作循环条件
v_isSushu VARCHAR2(100);
BEGIN
v_seq := sqrt(v_num)+1;
v_isSushu := '是素数';
FOR i IN 2..v_seq LOOP -- 只能被1和他本身整除的数叫素数!
IF mod(v_num,i) = 0 THEN
v_isSushu := '不是素数';
exit;
END IF;
END LOOP;
return v_isSushu;
EXCEPTION
WHEN OTHERS
THEN
RETURN ('Error in running show_description');
END;
/

select isSushu_fun(9) from dual;

SET SERVEROUTPUT ON;

DECLARE
v_suShu VARCHAR2(40);
v_isnum NUMBER(18,0);
v_isNotnum NUMBER(18,0);
BEGIN
v_isnum := 0;
FOR i IN 1..10000 LOOP
v_suShu := isSushu_fun(i);
IF v_suShu = '是素数' THEN
v_isnum := v_isnum + 1;
DBMS_OUTPUT.PUT_LINE(i||' '||v_suShu);
END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE('从1到10000 之间的素数共有:'||v_isnum);
END;
/
xiaoxiao8372 2010-08-05
  • 打赏
  • 举报
回复
凑个热闹!
declare @a int
declare @i int
declare @b int
set @a = 2
set @i = 1
set @b = 0
while @a<100
begin
while @i<@a
begin
if (@a%@i=0)
begin
set @b=@b + 1
end
set @i = @i + 1
end
if (@b<2)
begin
print @a
end
set @b = 0
set @i = 1
set @a = @a + 1
end
hanxue168 2010-08-05
  • 打赏
  • 举报
回复
学习了,MARK!
华夏小卒 2010-08-05
  • 打赏
  • 举报
回复
select a.number 
from master..spt_values a
where a.number between 2 and 100 and a.type='p'
and not exists(select * from master..spt_values b
where b.number between 2 and 100 and b.type='p'
and a.number>b.number
and a.number%b.number=0)
feilniu 2010-08-05
  • 打赏
  • 举报
回复
对于过程式语言,计算素数无非是循环,这方面T-SQL没有优势,例如用Python可以写得非常简洁:

for p in range(2,100):
for f in range(2,p):
if p % f == 0:
break
else: #这是for f in range(2,p)的else,不是if的else。
print(p)


而SQL是说明式语言,优势在于集合操作。计算素数,只需针对整数集合进行一下说明即可:
{整数n|n不存在2到n-1的整数因子}
playwarcraft 2010-08-05
  • 打赏
  • 举报
回复
playwarcraft 2010-08-05
  • 打赏
  • 举报
回复
求素数的方法很多,用sql来求,从方法及语句上来看,要“简洁”的多


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
王向飞 2010-08-05
  • 打赏
  • 举报
回复
学习~
feilniu 2010-08-05
  • 打赏
  • 举报
回复
有自然数辅助表,这种问题非常方便:

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)

天-笑 2010-08-05
  • 打赏
  • 举报
回复
呵呵 楼上的不错!~~~顶一个
永生天地 2010-08-05
  • 打赏
  • 举报
回复
-- 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
/*
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
*/
永生天地 2010-08-05
  • 打赏
  • 举报
回复
有点意思。
s_111111 2010-08-05
  • 打赏
  • 举报
回复
關注 ~
zheninchangjiang 2010-08-05
  • 打赏
  • 举报
回复
何必呢,找个C的,对照着翻译一下就算了
天-笑 2010-08-05
  • 打赏
  • 举报
回复
等待 高人!~~

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧