読者です 読者をやめる 読者になる 読者になる

Problem 13

euler perl


13問目。ちなみに11問目は面倒そうなので後回し。
今回の問題は 50桁の数値の加算を100回してその上位 10桁を求めろっていう問題。
Perlモジュールの bigintっていうのを使えば普通のたし算で解けてしまうのであまり
勉強にはなりそうにないので、一応配列使ったバージョンも。答えは同じになりました。

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

use bigint;
print "Answer is ", p13(), "\n";   # Answer is 5537376230
print "Answer is ", p13_2(), "\n"; # Answer is 5537376230

sub p13
{
  my $sum = 0;

  open my $FH, "<", "p13.dat";
  while(my $data = <$FH>){
    chomp($data);
    $sum += $data;
  }
  close $FH;

  return substr($sum, 0, 10);
}

sub p13_2
{
  open my $FH, "<", "p13.dat";
  my $first_value = <$FH>;
  chomp($first_value);
  my @sum = reverse split("", $first_value);

  while(my $data = <$FH>){
    chomp($data);
    my @num = reverse split("", $data);
    add_arrays(\@sum, \@num);
  }
  close $FH;

  return (reverse @sum)[0..9];
}

sub add_arrays
{
  my ($array1_ref, $array2_ref) = @_;
  my $carry_flag = 0;
  my $length = scalar @{$array1_ref};

  for my $i (0..($length - 1)){
    my $num = $array1_ref->[$i] + $array2_ref->[$i] + $carry_flag;

    $array1_ref->[$i] = ($num % 10);

    if($num >= 10){
      $carry_flag = 1;
    }
    else{
      $carry_flag = 0;
    }
  }

  $array1_ref->[$length] = 1 if $carry_flag == 1;
}