- 论坛徽章:
- 0
|
- #!/usr/bin/perl
- my $count = 0;
- my $i = 0;
- my $j = 0;
- my $ret;
- my @data = (1..100);
- my @data2 = ();
- while($i = pop @data){
- $j = pop @data || 1;
- $ret = $i * $j;
- unshift @data, $ret if ($ret =~/[24568]$/); #+ 乘法后可能产生0结尾的数
- next unless ($ret=~/(.*)(0+)$/);
- #print $ret,"\n";
- unshift @data, $1; #+ 去掉结尾的0
- $count += length $2;
- last unless (grep(/5$/, @data)); #+ 没5结尾的就不能再出现尾0了,不过办法太..., 而且好像也不准确
- }
- print "-------------------\n$count\n";
复制代码
% perl count.pl
-------------------
24
这个计算100!还算正确, 但是1000!就错了, 1000! 大概是249个0
- #!/usr/bin/perl
- my $count = 0;
- my $i = 0;
- my $j = 0;
- my $ret;
- my $max = $ARGV[0] || 100;
- my @data = (1..$max);
- do {
- $i = shift @data || 1;
- $j = shift @data || 1; # 这两处换成pop竟然会得到不同的结果 -_-!, 难道是pop时候乘机太大的原因?
- $ret = $i * $j;
- push @data, $ret if ($ret =~/[024568]$/);
- count(\@data); # removed all tail 0
- }while(grep /5$/, @data);
- sub count {
- my $array = shift;
- my $idx = 0;
- for ($idx = 0; $idx < scalar @$array; $idx++) {
- if ($array->[$idx] =~/(.*)(0+)$/){
- $array->[$idx] = $1;
- $count += length $2;
- }
- }
- }
- print "-------------------\n$count\n";
复制代码
/t % perl c2.pl 100
-------------------
24
/t % perl c2.pl 1000
-------------------
249
期待高手给出漂亮代码
[ 本帖最后由 dajun 于 2009-10-27 12:59 编辑 ] |
|