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
相关产品推荐
相关产品推荐

