免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 14314 | 回复: 30
打印 上一主题 下一主题

面试题目 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-27 02:59 |只看该作者 |倒序浏览
100*99*98*97.......
问题是想知道结果值中后面有几个0。
怎么算?

论坛徽章:
0
2 [报告]
发表于 2009-10-27 08:02 |只看该作者
### 数值太大情况下会转为 科学计数 造成错误


  1. use strict;
  2. use warnings;

  3. use Math::BigInt;
  4. my $re = eval join "*",(97..100);
  5. my $big =reverse Math::BigInt->new($re);
  6. $big =~ /^0+/;

  7. print $+[0];

复制代码

[ 本帖最后由 hitsubunnu 于 2009-10-27 10:17 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-10-27 09:15 |只看该作者


  1. #!/usr/bin/perl

  2. my $count = 0;
  3. my $i = 0;
  4. my $j = 0;
  5. my $ret;
  6. my @data = (1..100);

  7. while($i = pop @data){
  8.     $j = pop @data || 1;
  9.     $ret = $i * $j;
  10.     next unless ($ret=~/(0+)$/);
  11.     print $ret,"\n";
  12.     $count += length $1;
  13. }

  14. print "-------------------\n$count\n";



复制代码



看来下面的讨论才发现这个有问题

[ 本帖最后由 dajun 于 2009-10-27 11:48 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-10-27 09:27 |只看该作者
2 + 9 + 10

论坛徽章:
0
5 [报告]
发表于 2009-10-27 09:43 |只看该作者
我这么想的,不知道会不会漏掉:
10 公约数 1, 2, 5, 10
因此, 1-100范围内,有机会增加0的可能有 2 * 10个,再加上最后一个 100 是增加的 2个0而非1个,因此,+1
总共 21 个!

论坛徽章:
0
6 [报告]
发表于 2009-10-27 10:08 |只看该作者
正确答案为 24个

93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

答案来自于

http://www.wolframalpha.com/input/?i=100!

论坛徽章:
0
7 [报告]
发表于 2009-10-27 10:26 |只看该作者
突然想起来还有 50去掉 0后,还有一个 ×5,因此还可以多一个0,但这也直到 22 个,还有 2 个0,怎么也想不出来。。。

论坛徽章:
0
8 [报告]
发表于 2009-10-27 10:51 |只看该作者
(1-9)2*(1-9)5 顺序
10
100
这么算是22个..

用perl去算..直接给了一串..
9.33262154439441e+157

要是给整体的话 用0的正则到可以做出来的...

论坛徽章:
0
9 [报告]
发表于 2009-10-27 11:51 |只看该作者

  1. #!/usr/bin/perl

  2. my $count = 0;
  3. my $i = 0;
  4. my $j = 0;
  5. my $ret;
  6. my @data = (1..100);
  7. my @data2 = ();


  8. while($i = pop @data){
  9.     $j = pop @data || 1;
  10.     $ret = $i * $j;
  11.     unshift @data, $ret if ($ret =~/[24568]$/); #+ 乘法后可能产生0结尾的数
  12.     next unless ($ret=~/(.*)(0+)$/);
  13.     #print $ret,"\n";
  14.     unshift @data, $1;                       #+ 去掉结尾的0
  15.     $count += length $2;
  16.     last unless (grep(/5$/, @data));  #+ 没5结尾的就不能再出现尾0了,不过办法太..., 而且好像也不准确
  17. }

  18. print "-------------------\n$count\n";



复制代码



% perl count.pl
-------------------
24




这个计算100!还算正确, 但是1000!就错了, 1000! 大概是249个0


  1. #!/usr/bin/perl

  2. my $count = 0;
  3. my $i = 0;
  4. my $j = 0;
  5. my $ret;
  6. my $max = $ARGV[0] || 100;
  7. my @data = (1..$max);

  8. do {
  9.     $i = shift @data || 1;
  10.     $j = shift @data || 1;   # 这两处换成pop竟然会得到不同的结果 -_-!, 难道是pop时候乘机太大的原因?

  11.     $ret = $i * $j;
  12.     push @data, $ret if ($ret =~/[024568]$/);
  13.     count(\@data);              # removed all tail 0
  14. }while(grep /5$/, @data);

  15. sub count {
  16.     my $array = shift;
  17.     my $idx = 0;
  18.     for ($idx = 0; $idx < scalar @$array; $idx++) {
  19.         if ($array->[$idx] =~/(.*)(0+)$/){
  20.             $array->[$idx] = $1;
  21.             $count += length $2;
  22.         }
  23.     }
  24. }

  25. print "-------------------\n$count\n";

复制代码


/t % perl c2.pl 100
-------------------
24
/t % perl c2.pl 1000
-------------------
249





期待高手给出漂亮代码

[ 本帖最后由 dajun 于 2009-10-27 12:59 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2009-10-27 13:31 |只看该作者
#!/usr/bin/perl
use strict;

my $n=$ARGV[0];
my $num=0;
for ( 1..$n ) {
        my $tmp=$_;
        while ( $tmp%5==0 ) {
                $num++;
                $tmp/=5;
        }
}
print $num;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP