Perl 素数之和总是返回0
我有一个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 <
$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);