Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 素数之和总是返回0_Perl - Fatal编程技术网

Perl 素数之和总是返回0

Perl 素数之和总是返回0,perl,Perl,我有一个Perl代码,它接受一个数字,并将所有素数加起来。我不断得到值0,这意味着它没有更新我的$sum变量,但我不知道还能做什么 sub checkPrime { my($numb) = @_; $primeCheck = "prime\n"; if ($numb == 1) { $primeCheck = "notPrime\n"; } for ($i = 2; $i <

我有一个Perl代码,它接受一个数字,并将所有素数加起来。我不断得到值0,这意味着它没有更新我的
$sum
变量,但我不知道还能做什么

sub checkPrime {
    my($numb) = @_;
    $primeCheck = "prime\n";
     if ($numb == 1) {
        $primeCheck = "notPrime\n";
     }
     
     for ($i = 2; $i < $numb; $i++) {
        $mod = $numb % $i;
        if ($mod == 0) {
            $primeCheck = "notPrime\n"
        }
     }
     return $primeCheck;
}

sub sumOfPrimes {
    my($input) = @_;
    $sum = 0;
    
    for ($i = 2; $i <= $input; $i++) {
        if (checkPrime($i) eq "prime") {
            $sum = $sum + $i;
        }
    }
    return $sum;
}
print sumOfPrimes(10);
sub-checkPrime{
我的($numb)=@;
$primeCheck=“prime\n”;
如果($numb==1){
$primeCheck=“notPrime\n”;
}
对于($i=2;$i<$numb;$i++){
$mod=$numb%$i;
如果($mod==0){
$primeCheck=“notPrime\n”
}
}
退回$primeCheck;
}
次总和{
我的($input)=@;
$sum=0;

对于($i=2;$i您没有比较正确的字符串。设置值时包含换行符(
\n
),但比较时不包含。更改:

    if (checkPrime($i) eq "prime")
致:

这是最简单的更改,但您可能根本不需要在其中包含
\n

要求和,您需要确定数字是否为素数。让我们创建一个函数,如果数字为素数,则返回1,否则返回0

sub isPrime {
    my $n = shift;

    return 0 unless $n > 1;

    for( my $i = 2; $i < $n; $i++ ) {
        return 0 if $n % $i == 0;
    }

    return 1;
}

考虑1)重命名<代码>校验素< /代码>到代码> ISPrime < /代码>,和2)使用<代码> 1 < /代码>代替<代码>“Prime \n”/代码>和<代码> 0 < /代码>,而不是<代码>“NoPrime \n”/代码>。然后,<代码>(校验素($i)eq”Prime n \ >成为<代码>(IsPrime($i))
如果速度是一个非常重要的问题,您可以避免检查2的所有倍数(即,在循环中执行
$i+=2
,而不是
$i++
)。对于5的倍数也是一样,尽管它需要对代码进行更多的更改。关于
checkPrime
,不需要检查所有小于
$numb
的数字:在
sqrt$numb
处停止就足够了(不过您可能希望避免在每次迭代期间计算
sqrt$numb
)。此外,
在发现该数字不是素数时返回
。最后,由于您正在检查所有小于等于
$input
的数字,因此使用Eratosthene筛将更有效;-)大约一周前,我解释了很多:注意,你检查的数字太多了。一旦你得到了数字的平方根,检查超出这个范围的因子就没有意义了。
sub isPrime {
    my $n = shift;

    return 0 unless $n > 1;

    for( my $i = 2; $i < $n; $i++ ) {
        return 0 if $n % $i == 0;
    }

    return 1;
}
    $sum += $num if isPrime($num);