当前位置: 首页 > news >正文

一道MySQL笔试题: 输出 100 以内质数

在 MySQL 中输出 100 以内的质数,可以通过几种方法实现。以下是两种主要方法:使用存储过程和使用纯 SQL 查询。

方法一:使用存储过程

这种方法使用 MySQL 存储过程来生成质数,代码清晰易懂。

DELIMITER $$CREATE PROCEDURE GeneratePrimes(IN max_num INT)
BEGINDECLARE i INT DEFAULT 2;DECLARE j INT DEFAULT 2;DECLARE is_prime BOOLEAN;DECLARE result TEXT DEFAULT '';-- 循环检查每个数字是否为质数WHILE i <= max_num DOSET is_prime = TRUE;SET j = 2;-- 检查当前数字是否为质数WHILE j * j <= i DOIF i % j = 0 THENSET is_prime = FALSE;LEAVE inner_loop;END IF;SET j = j + 1;END WHILE;-- 如果是质数,添加到结果中IF is_prime THENIF result = '' THENSET result = CONCAT(result, i);ELSESET result = CONCAT(result, '&', i);END IF;END IF;SET i = i + 1;END WHILE;-- 输出结果SELECT result AS prime_numbers;
END$$DELIMITER ;-- 调用存储过程生成100以内的质数
CALL GeneratePrimes(100);

方法二:使用纯 SQL 查询

这种方法使用递归 CTE 和复杂的查询逻辑来生成质数。

WITH RECURSIVE numbers(n) AS (-- 生成2到100的数字序列SELECT 2UNION ALLSELECT n + 1 FROM numbers WHERE n < 100
),
primes AS (-- 筛选出质数SELECT n1.nFROM numbers n1WHERE NOT EXISTS (SELECT 1FROM numbers n2WHERE n2.n > 1 AND n2.n < n1.n AND n1.n % n2.n = 0)
)
-- 将结果连接成一个字符串,用&分隔
SELECT GROUP_CONCAT(n ORDER BY n SEPARATOR '&') AS prime_numbers
FROM primes;

方法三:使用数字表和复杂查询

如果你有一个包含连续数字的表(或者创建一个临时表),可以使用以下方法:

-- 创建临时数字表(如果不存在)
CREATE TEMPORARY TABLE IF NOT EXISTS numbers (n INT);-- 清空并插入2到100的数字
TRUNCATE TABLE numbers;
INSERT INTO numbers
WITH RECURSIVE seq (n) AS (SELECT 2UNION ALLSELECT n + 1 FROM seq WHERE n < 100
)
SELECT * FROM seq;-- 查询质数
SELECT GROUP_CONCAT(n ORDER BY n SEPARATOR '&') AS prime_numbers
FROM numbers n1
WHERE NOT EXISTS (SELECT 1FROM numbers n2WHERE n2.n > 1 AND n2.n <= SQRT(n1.n) AND n1.n % n2.n = 0
);

方法四:优化版本(使用平方根优化)

这个版本通过只检查到平方根来优化性能:

WITH RECURSIVE numbers(n) AS (SELECT 2UNION ALLSELECT n + 1 FROM numbers WHERE n < 100
)
SELECT GROUP_CONCAT(n ORDER BY n SEPARATOR '&') AS prime_numbers
FROM numbers n1
WHERE NOT EXISTS (SELECT 1FROM numbers n2WHERE n2.n BETWEEN 2 AND SQRT(n1.n) AND n1.n % n2.n = 0
);

结果

无论使用哪种方法,最终结果都应该是:

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

性能比较

  1. 存储过程:最灵活,代码最清晰,但需要创建存储过程
  2. 纯SQL查询:不需要创建额外对象,但查询可能较复杂
  3. 数字表方法:如果有现成的数字表,性能可能更好
  4. 优化版本:通过只检查到平方根,性能最佳

注意事项

  1. 如果使用存储过程,需要有创建存储过程的权限
  2. 递归CTE在MySQL 8.0及以上版本支持
  3. 对于更大的数字范围,可能需要优化算法或增加执行时间

选择哪种方法取决于你的具体需求和MySQL版本。对于100以内的质数,所有方法都应该能快速完成。

http://www.dtcms.com/a/349929.html

相关文章:

  • VIVO/OPPO手机,显示5G开关
  • 【SystemUI】锁屏来通知默认亮屏Wake模式
  • Mac 菜单栏多合一工具自荐:FancyTool
  • LeetCode算法日记 - Day 22: 提莫攻击、Z字形变换
  • 电影感人文街拍摆摊纪实摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!
  • 从手术室到街头摄像头:多模态融合如何让AI“看得懂”万物?
  • 搭建ftp服务器(主动模式,被动模式)
  • Canvas 动态高度文本图片生成器
  • Linux 详谈Ext系列⽂件系统(一)
  • 嵌入式(ARM方向)面试常见问题及解答
  • 【ARM】MDK在debug模式下断点的类型
  • blazor 学习笔记--vscode debug
  • C++11(Linux/GCC)字节序工具
  • 2025年09月计算机二级Python选择题每日一练——第七期
  • 栈指针(Stack Pointer)是什么?
  • 设置密钥连接服务器
  • 【基础-单选】向服务器提交表单数据,以下哪种请求方式比较合适
  • Linux 离线安装lrzsz(rz、sz上传下载小插件)
  • 什么是高防服务器?如何进行防御?
  • UE5多人MOBA+GAS 54、用户登录和会话创建请求
  • 矩阵系统源代码开发,支持OEM贴牌
  • 深入解析ffmpeg.dll:电脑中的关键组件及其相关问题解决​
  • 【龙泽科技】汽车车身测量与校正仿真教学软件【赛欧+SHARK】
  • 8851定期复盘代码实现设计模式的于芬应用
  • 中国计算机学会(CCF)推荐学术会议-B(计算机图形学与多媒体):DCC 2026
  • 《信息检索与论文写作》实验报告一 EI数据库检索
  • Allegro约束管理器设置详细教程
  • JUC之volatile关键字
  • 高通平台wifi--p2p issue
  • KubeBlocks for Redis的5种网络模式