+ -
当前位置:首页 → 问答吧 → 统计数字的程序&求效率高的代码。

统计数字的程序&求效率高的代码。

时间:2010-11-12

来源:互联网

昨天在公司和同事同时写了shell python perl程序查看效率。
算法实现 统计数字问题问题描述:一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1, 2,…,9。编程任务:给定表示书的总页码的10 进制整数n (1≤n≤109) 。编程计算书的全部页码中分别用到多少次数字0,1,2,…,9。

我写的perl代码如下:
#!/usr/bin/perl -w
#use strict;
my %hash;
for $key (0..9){
        $hash{$key}=0;
       
  foreach(1..$ARGV[0]){
          @arr=unpack("A" x length($_),$_);
          $n=grep /$key/,@arr;
    $hash{$key}+=$n;
}
}
for ( sort keys %hash){
        print "$_\t$hash{$_}\n";
}
执行效率:
0       488895
1       600001
2       600000
3       600000
4       600000
5       600000
6       600000
7       600000
8       600000
9       600000

real    1m22.885s
user    1m7.569s
sys     0m13.562s

应该有效率更高的perl代码,请各位帮忙看看。先谢了。

作者: liyangole   发布时间: 2010-11-12

在linux 系统执行:
   time perl data_analysic.pl  1000000

忘记贴这个了。

作者: liyangole   发布时间: 2010-11-12

楼主写的好像有点啰嗦~

my %hash;
foreach (1..ARGV[0]){
my @arr=split //,$_;
for(@arr){
$hash{$_}++;
}
}

for ( sort keys %hash){
        print "$_\t$hash{$_}\n";
}

作者: x9x9   发布时间: 2010-11-12

回复 x9x9


   我试试改改哈,多谢

作者: liyangole   发布时间: 2010-11-12

回复 liyangole


use strict;
use warnings;
my %hash;
foreach my $num(0..9){
      $hash{$num}=0;
}


for (my $i=1;$i<=$ARGV[0];$i++){
     &count($i);
}

foreach my $key(sort keys %hash){
      print "$key\t$hash{$key}\n";
}

sub count{
      for(my $i=0;$i<length$_[0];$i++){
            my $c=substr $_[0],$i,1;
            $hash{$c}++;
      }
}
$ time perl cout_number.pl 1000000
0       488895
1       600001
2       600000
3       600000
4       600000
5       600000
6       600000
7       600000
8       600000
9       600000

real    0m4.029s
user    0m3.950s
sys     0m0.007s

作者: orz_wohencai   发布时间: 2010-11-12

本帖最后由 zhlong8 于 2010-11-12 11:56 编辑

既然是对比效率,那就该用一样的算法吧?不应该针对某个语言专门优化,否则写个C扩展来企不更快

楼主有空贴出来结果啊

作者: zhlong8   发布时间: 2010-11-12