检查数字是否为素数使用powershell

时间:2015-01-31 18:00:45

标签: powershell primes

这是我的脚本,用于检查随机数是否为素数:

[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是素数。有什么想法可以搞定吗? 谢谢

2 个答案:

答案 0 :(得分:1)

我只是想改善现有答案。

对我来说很明显,我不明白为什么没有人指出,如果数字是平方数,跳过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;
}

}

答案 1 :(得分:0)

你需要在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错误   2真实   3真实   4错误   5真实   6假   7真实   8错误   9错误   10错误