You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perl质数求和函数始终返回0问题求助

解决你的Perl质数求和代码返回0的问题

嘿,我帮你定位到问题根源啦!你的代码始终返回0,核心原因是字符串匹配时的换行符差异,另外还有几个小细节需要调整,咱们一一梳理:

1. 最关键的问题:返回字符串带换行符,导致匹配失败

你在checkPrime函数里给$primeCheck赋值的是"prime\n"和"notPrime\n"——这里多了个换行符\n,但在sumOfPrimes里判断的是checkPrime($i) eq "prime"(不带换行)。两者完全不相等,所以if条件永远不会触发,$sum自然一直是初始值0。

解决方法很简单:把赋值里的\n去掉,直接用纯字符串:

$primeCheck = "prime";
# 以及
$primeCheck = "notPrime";

2. 必须修复的全局变量问题

你的代码里$primeCheck、$i、$mod、$sum这些变量都没有用my声明,它们会变成全局变量。比如两个函数里的循环变量$i是同一个,可能会干扰循环逻辑,引发奇怪的bug。一定要把这些变量声明为函数内的局部变量:

比如在checkPrime里:

my $primeCheck = "prime";
my $i;
my $mod;

或者更简洁地在循环里声明:

for (my $i = 2; $i < $numb; $i++) {
    my $mod = $numb % $i;
    # ...
}

3. 可选的质数判断效率优化

判断质数时,循环不需要遍历到$numb-1,只需要到sqrt($numb)就足够了——因为如果一个数有大于其平方根的因数,那对应的另一个因数肯定小于平方根,这样能大幅减少循环次数,提升效率。比如修改checkPrime里的循环:

my $sqrt_numb = sqrt($numb);
for (my $i = 2; $i <= $sqrt_numb; $i++) {
    # ...
}

修正后的完整代码

sub checkPrime { 
    my($numb) = @_; 
    my $primeCheck = "prime"; 
    if ($numb == 1) { 
        $primeCheck = "notPrime"; 
    } 
    my $sqrt_numb = sqrt($numb);
    for (my $i = 2; $i <= $sqrt_numb; $i++) { 
        my $mod = $numb % $i; 
        if ($mod == 0) { 
            $primeCheck = "notPrime";
            last; # 找到因数后直接跳出循环,不用继续判断
        } 
    } 
    return $primeCheck; 
} 

sub sumOfPrimes { 
    my($input) = @_; 
    my $sum = 0; 
    for (my $i = 2; $i <= $input; $i++) { 
        if (checkPrime($i) eq "prime") { 
            $sum += $i; # 简化写法,等价于$sum = $sum + $i
        } 
    } 
    return $sum; 
} 

print sumOfPrimes(10); # 现在会输出17(2+3+5+7)

内容的提问来源于stack exchange,提问作者Jeff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 13:03:12