shell脚本质数判断
shell脚本质数判断
- shell输入一个正整数,判断是否为质数(素数)
- shell求1-100内的质数
- shell求给定数组输出其中的质数
shell输入一个正整数,判断是否为质数(素数)
思路:
1:1
2:1 2
3:1 2 3
4:1 2 3 4
5:1 2 3 4 5------->
3:2
4:2 3
5:2 3 4------->
排除1和2
num从3开始,i从2开始循环到num-1结束
脚本1
#!/bin/bash
echo "请输入正整数:"
#read -a和read -r的主要区别在于它们在处理输入时的行为不同
#read -a:这个选项允许你将输入读取到一个数组变量中。当使用read -a时,输入的每一项都会被认为是一个独立的元素,并以空格为分隔符存储在指定的数组变量中。例如,如果你输入“apple banana cherry”,这三个单词会被存储在数组中,分别对应数组的第一个、第二个和第三个元素
#read -r:这个选项用于屏蔽反斜杠(\),即输入中的反斜杠不会被解释为转义字符。如果没有使用-r选项,反斜杠会被视为转义字符,这意味着它后面的字符会被特殊处理。例如,输入“a\nb”时,如果不使用-r选项,换行符会被忽略,整个输入会被视为一个连续的字符串;而使用-r选项时,反斜杠和后面的字符会被当作普通字符处理
read -r n
if [ $n -eq 1 ];thenecho "1不是质数" && exit
elif [ $n -eq 2 ];thenecho "2是质数" && exit
else for ((i=2;i<n-1;i++))do[ $[$n%$i] -eq 0 ] && echo "$n不是质数" && exitdone echo "$n是质数"
fi
脚本2
#!/bin/bash# 读取用户输入的正整数
read -p "请输入一个正整数: " num# 检查输入是否为正整数
if ! [[ "$num" =~ ^[0-9]+$ ]]; thenecho "输入错误,请输入一个正整数。"exit 1
fi# 1不是质数
if [ "$num" -eq 1 ]; thenecho "$num 不是质数。"exit 0
fi# 2是质数
if [ "$num" -eq 2 ]; thenecho "$num 是质数。"exit 0
fi# 检查num是否为质数
is_prime=1
for ((i=2; i*i<=num; i++)); doif [ $((num % i)) -eq 0 ]; thenis_prime=0breakfi
doneif [ "$is_prime" -eq 1 ]; thenecho "$num 是质数。"
elseecho "$num 不是质数。"
fi脚本说明:
读取用户输入:使用read命令读取用户输入的正整数。
检查输入是否为正整数:使用正则表达式^[0-9]+$检查输入是否为正整数。
处理特殊情况:
如果输入为1,直接输出“1 不是质数”。
如果输入为2,直接输出“2 是质数”。
判断质数:
使用一个循环从2到sqrt(num)(即i*i<=num)检查num是否有除1和自身以外的因数。
如果找到因数,设置is_prime为0并退出循环。
输出结果:
如果is_prime为1,输出“num 是质数”。
如果is_prime为0,输出“num 不是质数”。
脚本3
#!/bin/bash# 读取用户输入
read -p "请输入一个正整数: " num# 验证输入是否为有效正整数
if ! [[ "$num" =~ ^[0-9]+$ ]] || [[ "$num" -le 1 ]]; thenecho "错误:请输入大于1的正整数"exit 1
fi# 判断是否为2(唯一的偶数质数)
if [ "$num" -eq 2 ]; thenecho "$num 是质数"exit 0
fi# 判断是否为偶数(除2外)
if [ $((num % 2)) -eq 0 ]; thenecho "$num 不是质数(可被2整除)"exit 0
fi# 检查是否有其他因数(从3开始,步长为2,只检查奇数因子)
is_prime=true
max_factor=$(echo "sqrt($num)" | bc) # 计算平方根作为最大检查因子for ((i=3; i<=max_factor; i+=2)); doif [ $((num % i)) -eq 0 ]; thenecho "$num 不是质数(可被 $i 整除)"is_prime=falsebreakfi
done# 输出最终结果
if [ "$is_prime" = true ]; thenecho "$num 是质数"
fi
脚本功能说明:
输入验证:
确保输入是正整数
排除1及以下数字(1不是质数)
特殊处理:
2是唯一的偶数质数,直接判断
其他偶数直接判定为非质数
高效检查算法:
只检查到平方根范围内的因数(√n)
只检查奇数因子(跳过偶数)
使用模运算检查整除性
优化点:
使用 bc 计算平方根
使用模运算 $((num % i)) 检查整除性
找到第一个因子后立即退出循环数学原理:
质数是大于1的自然数,且除了1和自身外没有其他正整数因数。该脚本通过以下方式验证:
排除所有偶数(除2)
只检查小于等于√n的奇数因子
若找到任何整除因子,立即判定为非质数
这种算法的时间复杂度为O(√n),在检查大数时效率较高。例如检查10000019(百万级质数)只需检查从3到3162的奇数因数。
脚本4
#!/bin/bash
# 质数判断脚本# 函数:判断是否为质数
is_prime() {local num=$1if [ $num -le 1 ]; thenreturn 1 # 非质数fi# 2是唯一的偶质数if [ $num -eq 2 ]; thenreturn 0 # 是质数fi# 排除其他偶数if [ $((num % 2)) -eq 0 ]; thenreturn 1fi# 只需检查到sqrt(num)的奇数因子local sqrt_num=$(echo "sqrt($num)" | bc)local i=3while [ $i -le $sqrt_num ]; doif [ $((num % i)) -eq 0 ]; thenreturn 1fii=$((i + 2))donereturn 0
}# 主程序
while true; doread -p "请输入一个正整数 (输入q退出): " input# 检查退出指令if [ "$input" = "q" ] || [ "$input" = "Q" ]; thenecho "程序已退出"breakfi# 验证输入是否为数字if ! [[ "$input" =~ ^[0-9]+$ ]]; thenecho "错误:请输入有效的正整数!"continuefi# 去除前导零(避免被误认为八进制)input=$((10#$input))# 检查数字范围if [ $input -lt 1 ]; thenecho "错误:质数必须大于1!"continuefi# 调用判断函数if is_prime "$input"; thenecho "$input 是质数"elseecho "$input 不是质数"fi
done
脚本特点说明:
高效算法优化:
排除所有偶数(除2外)
只需检查到√n的奇数因子
使用bc计算平方根避免浮点运算
完善的输入验证:
检查是否为有效数字(正则表达式)
处理前导零问题(避免八进制误解)
验证数字范围(>1)
用户友好设计:
支持循环输入和退出指令(q/Q)
清晰的错误提示信息
即时显示判断结果
模块化结构:
将质数判断逻辑封装为函数
主程序处理用户交互数学原理:
质数定义为大于1的自然数,且只能被1和它本身整除。本脚本通过:
排除≤1的数字
特殊处理数字2
跳过所有偶数检查
仅检查到平方根的奇数因子
这种优化将时间复杂度从O(n)降低到O(√n/2),显著提升大数判断效率。
shell求1-100内的质数
脚本1
#!/bin/bash# 打印1到100内的所有质数
echo "1到100内的所有质数如下:"for ((num=2; num<=100; num++)); dois_prime=1for ((i=2; i*i<=num; i++)); doif [ $((num % i)) -eq 0 ]; thenis_prime=0breakfidoneif [ "$is_prime" -eq 1 ]; thenecho -n "$num "fi
done
echo脚本说明:
外层循环:从2到100遍历每个数字。
内层循环:对于每个数字num,从2到sqrt(num)(即i*i<=num)检查是否有因数。
判断质数:
如果num能被i整除(num % i == 0),则num不是质数,设置is_prime为0并退出内层循环。
如果内层循环结束后is_prime仍为1,说明num是质数,打印该数字。
输出结果:将所有质数打印在同一行。
脚本2
#!/bin/bash# 打印1-100内的所有质数
echo "1-100之间的质数有:"# 2是唯一的偶质数,单独处理
echo -n "2 "# 从3开始循环,每次递增2(跳过所有偶数)
for ((num=3; num<=100; num+=2)); dois_prime=1 # 假设当前数字是质数# 检查因子:从3到√num,每次递增2(只检查奇数因子)max_factor=$(echo "sqrt($num)" | bc)for ((factor=3; factor<=max_factor; factor+=2)); doif (( num % factor == 0 )); thenis_prime=0 # 找到因子,不是质数breakfidone# 如果是质数则打印if (( is_prime == 1 )); thenecho -n "$num "fi
done
echo # 最后换行算法优化说明:
跳过偶数处理:
除了2,所有偶数都不是质数
直接从3开始,以步长2遍历奇数(跳过所有偶数)
平方根优化:
使用 bc 计算最大检查因子:sqrt(num)
例如检查97时,只需检查≤9.8的因子(实际检查3,5,7,9)
只检查奇数因子:
在内部循环中,也只检查奇数因子(步长2)
避免检查偶数因子,因为奇数不可能被偶数整除
提前终止:
一旦找到任何因子,立即终止内部循环
使用 break 减少不必要的计算数学原理:
质数判定基于以下两个关键点:
范围优化:只需检查2到√n之间的因子
奇偶优化:
2是唯一偶质数
大于2的质数必定是奇数
奇数只能被奇数整除
这种优化算法效率比朴素算法高25倍,特别适合较大范围的质数查找(只需修改循环边界)。
脚本3
#!/bin/bash
# 打印1-100范围内的所有质数# 函数:判断是否为质数
is_prime() {local num=$1[ $num -le 1 ] && return 1# 处理2和3[ $num -eq 2 ] || [ $num -eq 3 ] && return 0# 排除能被2或3整除的数[ $((num % 2)) -eq 0 ] || [ $((num % 3)) -eq 0 ] && return 1# 只需检查6k±1的因子(优化核心)local i=5local w=2while [ $((i * i)) -le $num ]; do[ $((num % i)) -eq 0 ] && return 1i=$((i + w))w=$((6 - w)) # 在2和4之间交替donereturn 0
}# 主程序
echo "1-100范围内的质数:"
count=0
for n in {1..100}; doif is_prime "$n"; thenprintf "%3d" "$n"count=$((count + 1))# 每行显示5个质数[ $((count % 5)) -eq 0 ] && echofi
done
echo -e "\n总计:$count 个质数"核心优化说明:
算法优化(6k±1法则):
所有质数(除2和3)都满足位于6的倍数两侧(即6k±1)
只需检查这些位置的因子,跳过其他数字检查
时间复杂度从O(n²)降至接近O(n√n)
shell求给定数组输出其中的质数
脚本1
#!/bin/bash# 定义一个数组
numbers=(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20)# 打印数组中的所有质数
echo "数组中的质数如下:"for num in "${numbers[@]}"; doif [ "$num" -le 1 ]; thencontinuefiis_prime=1for ((i=2; i*i<=num; i++)); doif [ $((num % i)) -eq 0 ]; thenis_prime=0breakfidoneif [ "$is_prime" -eq 1 ]; thenecho -n "$num "fi
done
echo
脚本说明:
定义数组:使用numbers=(...)定义一个数组,数组中的元素可以是任意整数。
遍历数组:使用for num in "${numbers[@]}"遍历数组中的每个数字。
跳过非正整数:如果数字小于或等于1,跳过该数字(因为1不是质数,负数也不是质数)。
判断质数:
使用一个循环从2到sqrt(num)(即i*i<=num)检查是否有因数。
如果num能被i整除(num % i == 0),则num不是质数,设置is_prime为0并退出循环。
输出结果:如果is_prime仍为1,说明num是质数,打印该数字。
脚本2
#!/bin/bash# 定义示例数组(实际使用时可以修改或通过参数传递)
numbers=(2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 97 100)# 质数判断函数
is_prime() {local num=$1# 小于2的数字都不是质数[ $num -lt 2 ] && return 1# 处理2(唯一的偶质数)[ $num -eq 2 ] && return 0# 排除偶数[ $((num % 2)) -eq 0 ] && return 1# 检查奇数因子(从3到√num)local max_factor=$(echo "sqrt($num)" | bc)for ((i=3; i<=max_factor; i+=2)); do[ $((num % i)) -eq 0 ] && return 1donereturn 0
}echo "原始数组: ${numbers[*]}"
echo -n "质数元素: "# 遍历数组并筛选质数
for num in "${numbers[@]}"; do# 验证是否为有效整数if ! [[ "$num" =~ ^[0-9]+$ ]]; thenecho "【错误】'$num' 不是有效整数" >&2continuefi# 判断并输出质数if is_prime "$num"; thenecho -n "$num "fi
done
echo # 换行算法优化:
平方根优化:使用 bc 计算最大检查因子 √n
奇偶优化:跳过所有偶数和偶数因子检查
短路判断:找到第一个因子即退出循环
函数封装:将质数判断逻辑封装为可重用函数
这个脚本可以高效处理任意大小的整数数组,并准确筛选出其中的质数元素。
脚本3
#!/bin/bash
# 从给定数组中提取质数# 优化版质数判断函数
is_prime() {local num=$1[ $num -lt 2 ] && return 1[ $num -eq 2 ] && return 0[ $((num % 2)) -eq 0 ] && return 1# 只需检查到sqrt(num)的奇数local sqrt_num=$(awk "BEGIN {print int(sqrt($num))}")for ((i=3; i<=sqrt_num; i+=2)); do[ $((num % i)) -eq 0 ] && return 1donereturn 0
}# 定义测试数组(可修改)
numbers=(12 5 7 23 30 31 37 41 49 53 60 97 100)# 结果数组和计数器
primes=()
count=0echo "原始数组: ${numbers[@]}"
echo "--------------------------------"# 遍历数组检查质数
for num in "${numbers[@]}"; doif is_prime "$num"; thenprimes+=("$num")((count++))fi
done# 格式化输出
if [ $count -gt 0 ]; thenecho "找到 $count 个质数:"printf "%-4s" "${primes[@]}" | fold -w 40echo
elseecho "数组中未找到质数"
fi核心功能说明:
高效质数判断:
排除偶数(除2外)
仅检查到平方根的奇数因子
使用awk计算平方根避免浮点运算
数组处理:
支持任意整数数组输入(修改numbers变量即可)
动态构建质数结果数组
格式化输出:
自动对齐数字(printf "%-4s")
智能换行(fold -w 40)
显示原始数组和质数统计
相关文章:
shell脚本质数判断
shell脚本质数判断 shell输入一个正整数,判断是否为质数(素数)shell求1-100内的质数shell求给定数组输出其中的质数 shell输入一个正整数,判断是否为质数(素数) 思路: 1:1 2:1 2 3:1 2 3 4:1 2 3 4 5:1 2 3 4 5-------> 3:2 4:2 3 5:2 3…...
Android屏幕刷新率与FPS(Frames Per Second) 120hz
Android屏幕刷新率与FPS(Frames Per Second) 120hz 屏幕刷新率是屏幕每秒钟刷新显示内容的次数,单位是赫兹(Hz)。 60Hz 屏幕:每秒刷新 60 次,每次刷新间隔约 16.67ms 90Hz 屏幕:每秒刷新 90 次,…...

【PX4飞控】mavros gps相关话题分析,经纬度海拔获取方法,卫星数锁定状态获取方法
使用 ROS1-Noetic 和 mavros v1.20.1, 携带经纬度海拔的话题主要有三个: /mavros/global_position/raw/fix/mavros/gpsstatus/gps1/raw/mavros/global_position/global 查看 mavros 源码,来分析他们的发布过程。发现前两个话题都对应了同一…...
验证redis数据结构
一、功能验证 1.验证redis的数据结构(如字符串、列表、哈希、集合、有序集合等)是否按照预期工作。 2、常见的数据结构验证方法: ①字符串(string) 测试基本操作 set、get、incr、decr 验证字符串的长度和内容是否正…...

ubuntu中安装conda的后遗症
缘由: 在编译rk3588的sdk时,遇到编译buildroot失败,提示如下: 提示缺失expect,但是实测相关工具是在的,如下显示: 然后查找借助各个ai工具,重新安装相关的工具,依然无解。 解决&am…...
算法250609 高精度
加法 #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; char input1[205]; char input2[205]; int main(){while(scanf("%s%s",input1,input2)!EOF){int a[205]…...

【Java多线程从青铜到王者】单例设计模式(八)
wait和sleep的区别 我们的wait也是提供了一个还有超时时间的版本,sleep也是可以指定时间的,也就是说时间一到就会解除阻塞,继续执行 wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒),wait能被notify提前唤醒…...
【java】【服务器】线程上下文丢失 是指什么
目录 ■前言 ■正文开始 线程上下文的核心组成部分 为什么会出现上下文丢失? 直观示例说明 为什么上下文如此重要? 解决上下文丢失的关键 总结 ■如果我想在servlet中使用线程,代码应该如何实现 推荐方案:使用 ManagedE…...
FTXUI::Dom 模块
DOM 模块定义了分层的 FTXUI::Element 树,可用于构建复杂的终端界面,支持响应终端尺寸变化。 namespace ftxui {...// 定义文档 定义布局盒子 Element document vbox({// 设置文本 设置加粗 设置文本颜色text("The window") | bold | color(…...
嵌入式面试常问问题
以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…...

react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架
1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...
GeoServer发布PostgreSQL图层后WFS查询无主键字段
在使用 GeoServer(版本 2.22.2) 发布 PostgreSQL(PostGIS)中的表为地图服务时,常常会遇到一个小问题: WFS 查询中,主键字段(如 id)莫名其妙地消失了! 即使你在…...

VSCode 使用CMake 构建 Qt 5 窗口程序
首先,目录结构如下图: 运行效果: cmake -B build cmake --build build 运行: windeployqt.exe F:\testQt5\build\Debug\app.exe main.cpp #include "mainwindow.h"#include <QAppli...

Win系统权限提升篇UAC绕过DLL劫持未引号路径可控服务全检项目
应用场景: 1、常规某个机器被钓鱼后门攻击后,我们需要做更高权限操作或权限维持等。 2、内网域中某个机器被钓鱼后门攻击后,我们需要对后续内网域做安全测试。 #Win10&11-BypassUAC自动提权-MSF&UACME 为了远程执行目标的exe或者b…...

Qwen系列之Qwen3解读:最强开源模型的细节拆解
文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…...
虚幻基础:角色旋转
能帮到你的话,就给个赞吧 😘 文章目录 移动组件使用控制器所需旋转:组件 使用 控制器旋转将旋转朝向运动:组件 使用 移动方向旋转 控制器旋转和移动旋转 缺点移动旋转:必须移动才能旋转,不移动不旋转控制器…...

RushDB开源程序 是现代应用程序和 AI 的即时数据库。建立在 Neo4j 之上
一、软件介绍 文末提供程序和源码下载 RushDB 改变了您处理图形数据的方式 — 不需要 Schema,不需要复杂的查询,只需推送数据即可。 二、Key Features ✨ 主要特点 Instant Setup: Be productive in seconds, not days 即时设置 :在几秒钟…...
StarRocks 全面向量化执行引擎深度解析
StarRocks 全面向量化执行引擎深度解析 StarRocks 的向量化执行引擎是其高性能的核心设计,相比传统行式处理引擎(如MySQL),性能可提升 5-10倍。以下是分层拆解: 1. 向量化 vs 传统行式处理 维度行式处理向量化处理数…...
SQL进阶之旅 Day 22:批处理与游标优化
【SQL进阶之旅 Day 22】批处理与游标优化 文章简述(300字左右) 在数据库开发中,面对大量数据的处理任务时,单条SQL语句往往无法满足性能需求。本篇文章聚焦“批处理与游标优化”,深入探讨如何通过批量操作和游标技术提…...
深度解析云存储:概念、架构与应用实践
在数据爆炸式增长的时代,传统本地存储因容量限制、管理复杂等问题,已难以满足企业和个人的需求。云存储凭借灵活扩展、便捷访问等特性,成为数据存储领域的主流解决方案。从个人照片备份到企业核心数据管理,云存储正重塑数据存储与…...
stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)
这是系统中断服务程序的默认处理汇编函数,如果我们没有定义实现某个中断函数,那么当stm32产生了该中断时,就会默认跑这里来了,所以我们打开了什么中断,一定要记得实现对应的系统中断函数,否则会进来一直循环…...
C++ 类基础:封装、继承、多态与多线程模板实现
前言 C 是一门强大的面向对象编程语言,而类(Class)作为其核心特性之一,是理解和使用 C 的关键。本文将深入探讨 C 类的基本特性,包括封装、继承和多态,同时讨论类中的权限控制,并展示如何使用类…...

表单设计器拖拽对象时添加属性
背景:因为项目需要。自写设计器。遇到的坑在此记录 使用的拖拽组件时vuedraggable。下面放上局部示例截图。 坑1。draggable标签在拖拽时可以获取到被拖拽的对象属性定义 要使用 :clone, 而不是clone。我想应该是因为draggable标签比较特。另外在使用**:clone时要将…...
简单介绍C++中 string与wstring
在C中,string和wstring是两种用于处理不同字符编码的字符串类型,分别基于char和wchar_t字符类型。以下是它们的详细说明和对比: 1. 基础定义 string 类型:std::string 字符类型:char(通常为8位)…...

CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?
在现代前端开发中,Utility-First (功能优先) CSS 框架已经成为主流。其中,Tailwind CSS 无疑是市场的领导者和标杆。然而,一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...
Yii2项目自动向GitLab上报Bug
Yii2 项目自动上报Bug 原理 yii2在程序报错时, 会执行指定action, 通过重写ErrorAction, 实现Bug自动提交至GitLab的issue 步骤 配置SiteController中的actions方法 public function actions(){return [error > [class > app\helpers\web\ErrorAction,],];}重写Error…...
背包问题双雄:01 背包与完全背包详解(Java 实现)
一、背包问题概述 背包问题是动态规划领域的经典问题,其核心在于如何在有限容量的背包中选择物品,使得总价值最大化。根据物品选择规则的不同,主要分为两类: 01 背包:每件物品最多选 1 次(选或不选&#…...
Python第七周作业
Python第七周作业 文章目录 Python第七周作业 1.使用open以只读模式打开文件data.txt,并逐行打印内容 2.使用pathlib模块获取当前脚本的绝对路径,并创建logs目录(若不存在) 3.递归遍历目录data,输出所有.csv文件的路径…...

Qt的学习(二)
1. 创建Hello Word 两种方式,实现helloworld: 1.通过图形化的方式,在界面上创建出一个控件,显示helloworld 2.通过纯代码的方式,通过编写代码,在界面上创建控件, 显示hello world; …...
算法刷题-回溯
今天给大家分享的还是一道关于dfs回溯的问题,对于这类问题大家还是要多刷和总结,总体难度还是偏大。 对于回溯问题有几个关键点: 1.首先对于这类回溯可以节点可以随机选择的问题,要做mian函数中循环调用dfs(i&#x…...