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; }