【问题标题】:segmentation fault in perl grep functionperl grep 函数中的分段错误
【发布时间】:2014-02-28 12:08:24
【问题描述】:

处理欧拉问题 3

The prime factors of 13195 are 5, 7, 13 and 29.
What is the largest prime factor of the number 600851475143 ?

这是我的 Perl 代码,只是尝试先获取所有因素,但出现分段错误,我的 Perl 年龄只有 2 个月左右,不知道为什么。运行时出现分段错误 11。

 #!/usr/bin/perl
 use warnings; 
 use strict;

 my $number = 600851475143;
 my @factors = grep {$number % $_ == 0} (1..$number);
 print @factors;

用 sudo 再次运行,没有分段错误,但没有打印出来。

【问题讨论】:

  • 是的,删除了打印代码
  • (1..$number) 将生成一个 2T 数组。您使用的是 64 位操作系统吗?
  • 是的,Mac OS X 10.8.5,perlbrew Perl 5.18.2。也试过 bigint,没有任何区别。
  • 我猜还是因为你试图分配太多内存。
  • 同意,即使我删除了最后 3 位数字(所以小了 1000 倍)。它打印出“内存不足!”在我的 Linux VM 上,使用了我在 MacBook Pro 上所有剩余的 12G RAM。会尝试别的东西

标签: perl


【解决方案1】:

来自谷歌搜索“euler problem 3”并翻译 python 代码的代码。

use strict;
use warnings;

sub largest_prime_factor {
    my $n = shift;

    my $largest_factor = 1;

    # remove any factors of 2 first
    while ($n % 2 == 0) {
        $largest_factor = 2;
        $n /= 2;
    }

    # now look at odd factors
    my $p = 3;
    while ($n != 1) {
        while ($n % $p == 0) {
            $largest_factor = $p;
            $n /= $p;
        }
        $p += 2
    }

    return $largest_factor
}

print largest_prime_factor(600851475143);

1;

__END__

还是靠好的ole cpan:

use Math::Prime::Util qw(factor);
use List::Util qw(max);

use strict;
use warnings;

print max factor(600851475143);

【讨论】:

  • CPAN 解决方案现在稍微容易一些: perl -E 'use ntheory ":all";说 vecmax(因子(600851475143));'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多