使用 powershell 检查数字是否为质数
Check if a number is prime Using powershell
这是我用来检查随机数是否为质数的脚本:
[int]$nombre = Get-Random -Minimum 1 -Maximum 10
$nombre
$j=0
if($nombre -lt 2) { " $nombre n'est pas premier " }
else {
for($i=1; $i -le $nombre; $i++){
if( $nombre%$i -eq 0) {$j++}
}
if($j -eq 2 ) { "Le nombre est premier "}
else {"Ce nombre est premier"}
}
当我执行脚本时,我得到了错误的结果,比如 4 是质数。有什么办法解决吗?
谢谢
您需要从 3 开始 for 循环,而不是 1。所有内容都可以被 1 整除,您已经测试过被 2 整除。
您的代码有多处错误。 j 计数器就是其中之一。包括 $nombre 在内的循环也是一个。
function Test-Prime {
param(
[Parameter(ValueFromPipeline=$true)]
[int]$number
)
Process {
$prime = $true;
if ($number -eq 1) {
$prime = $false;
}
if ($number -gt 3) {
# limit loop to max sqrt($number)
$sqrt = [math]::Sqrt($number);
for($i = 2; $i -le $sqrt; $i++) {
if ($number % $i -eq 0) {
# we found it is not prime
$prime = $false;
break;
}
}
}
return $prime;
}
}
# test for all values between 1 and 100
1..10 | %{ Write-Host " $_ $( Test-Prime $_)" }
打印
1 False
2 True
3 True
4 False
5 True
6 False
7 True
8 False
9 False
10 False
我只是想改进现有的答案。
对我来说很明显,我不明白为什么没有人指出,如果数字是平方数,它可以通过跳过for循环来简化整个过程,只需添加if ([math]::Sqrt{$number} -is [int]) {$prime = $false}
循环之前的代码,根据定义平方数是合数,为什么没人注意到?
更新:基于之前答案的更好函数,它将 $false 分配给负数、零和分数以及非数字:
function Test-Prime {
param(
[Parameter(ValueFromPipeline=$true)]
$number
)
Process {
$prime = $true;
if ($number -isnot [int]) {$prime = $false}
elseif ($number -le 0) {$prime = $false}
else {
if ($number -eq 1) {
$prime = $false;
}
if ($number -gt 3) {
$sqrt = [math]::Sqrt($number);
if ($sqrt -is [int]) {$prime = $false}
else {
for($i = 2; $i -le $sqrt; $i++) {
if ($number % $i -eq 0) {
$prime = $false;
break;
}
}
}
}
}
return $prime;
}
}
这是我用来检查随机数是否为质数的脚本:
[int]$nombre = Get-Random -Minimum 1 -Maximum 10
$nombre
$j=0
if($nombre -lt 2) { " $nombre n'est pas premier " }
else {
for($i=1; $i -le $nombre; $i++){
if( $nombre%$i -eq 0) {$j++}
}
if($j -eq 2 ) { "Le nombre est premier "}
else {"Ce nombre est premier"}
}
当我执行脚本时,我得到了错误的结果,比如 4 是质数。有什么办法解决吗? 谢谢
您需要从 3 开始 for 循环,而不是 1。所有内容都可以被 1 整除,您已经测试过被 2 整除。
您的代码有多处错误。 j 计数器就是其中之一。包括 $nombre 在内的循环也是一个。
function Test-Prime {
param(
[Parameter(ValueFromPipeline=$true)]
[int]$number
)
Process {
$prime = $true;
if ($number -eq 1) {
$prime = $false;
}
if ($number -gt 3) {
# limit loop to max sqrt($number)
$sqrt = [math]::Sqrt($number);
for($i = 2; $i -le $sqrt; $i++) {
if ($number % $i -eq 0) {
# we found it is not prime
$prime = $false;
break;
}
}
}
return $prime;
}
}
# test for all values between 1 and 100
1..10 | %{ Write-Host " $_ $( Test-Prime $_)" }
打印
1 False
2 True
3 True
4 False
5 True
6 False
7 True
8 False
9 False
10 False
我只是想改进现有的答案。
对我来说很明显,我不明白为什么没有人指出,如果数字是平方数,它可以通过跳过for循环来简化整个过程,只需添加if ([math]::Sqrt{$number} -is [int]) {$prime = $false}
循环之前的代码,根据定义平方数是合数,为什么没人注意到?
更新:基于之前答案的更好函数,它将 $false 分配给负数、零和分数以及非数字:
function Test-Prime {
param(
[Parameter(ValueFromPipeline=$true)]
$number
)
Process {
$prime = $true;
if ($number -isnot [int]) {$prime = $false}
elseif ($number -le 0) {$prime = $false}
else {
if ($number -eq 1) {
$prime = $false;
}
if ($number -gt 3) {
$sqrt = [math]::Sqrt($number);
if ($sqrt -is [int]) {$prime = $false}
else {
for($i = 2; $i -le $sqrt; $i++) {
if ($number % $i -eq 0) {
$prime = $false;
break;
}
}
}
}
}
return $prime;
}
}