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

mgdq6dx1  于 2023-02-19  发布在  Shell
关注(0)|答案(3)|浏览(188)

这是我用来检查一个随机数是否为素数的脚本:

[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是一个质数。有什么想法来修复它吗?谢谢

yv5phkfx

yv5phkfx1#

我只是想改进现有的答案。
对我来说,这是如此明显,我不明白为什么没有人指出,它可以简化整个过程,跳过循环,如果数字是一个平方数,只需添加if ([math]::Sqrt{$number} -is [int]) {$prime = $false}到代码之前的循环,根据定义,平方数是合数,为什么没有人注意到它?
Update:一个基于前面答案的更好的函数,它将$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;
}

}

doinxwow

doinxwow2#

你需要从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个错误

dw1jzc5e

dw1jzc5e3#

下面是另一个代码片段,它显示了1000以内的第一素数。

cls
$primelist = [System.Collections.ArrayList]::new()
foreach($number in 0..1000) {
    if ($number -le 3) {
        $isprime = $number -gt 1
        $maxDiv  = 2
    } else {
        $isprime = $true
        foreach($div in $primeList) {
            if ($number % $div -eq 0) {
                $isprime = $false
                if ($maxDiv*$maxDiv -lt $number){$maxDiv++}
                break
            }
            if ($div -ge $maxDiv) {break}
        }
    }
    if ($isprime) {[void]$primelist.Add($number)}
}
write-host ([string]::Join(',',$primeList.ToArray()))

对于更大的素数,我建议使用拉宾-米勒函数。详细信息请参阅这里:如何通过密码提供程序生成一个大素数?

相关问题