免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: huwenhuo
打印 上一主题 下一主题

面试题目 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2009-10-28 02:12 |只看该作者
是的, 上次没看仔细, 第13楼原来是一个全新的解法。

当时我想到了bignum, 但是觉得也不是正解, 因为要把100换成1000也要糟的。

呵呵, 已经过去了。 我给老板写个面试回复去。 其实我是学生物的, 偏向信息学点, 结果那老板全当计算机人才来考我了。


anyway, 非常感谢大家!!

论坛徽章:
0
22 [报告]
发表于 2009-11-03 09:48 |只看该作者

回复 #1 huwenhuo 的帖子

#! /usr/bin/perl -w

$num=shift(@ARGV);
$result=1;
$tmp=0;
foreach(1..$num)
{
  $result=$result*$_;
  if($result=~/((\d){0,5})(0+)$/){
  $length=length $3;    ##获取0的个数
  $tmp+=$length;
  $result=$1;           #只取除去0后的最后5位,便于保存。
        }
}
print $tmp;

论坛徽章:
2
午马
日期:2015-01-27 11:22:392015年辞旧岁徽章
日期:2015-03-03 16:54:15
23 [报告]
发表于 2009-11-03 10:48 |只看该作者
逢5逢0 必+1, 而 25 50 75 100比较特殊

25=5*5
50=5*5*2
75=5*5*3
100=5*5*4
因为每加一个零相当于加一5*2的倍数,所以 100以内一共有20个5的倍数,(2的倍数不用考虑,因为太多,足够了。。)
20再加上4个特殊数字。就是24

论坛徽章:
2
午马
日期:2015-01-27 11:22:392015年辞旧岁徽章
日期:2015-03-03 16:54:15
24 [报告]
发表于 2009-11-03 13:07 |只看该作者
原帖由 to407 于 2009-11-3 10:48 发表
逢5逢0 必+1, 而 25 50 75 100比较特殊

25=5*5
50=5*5*2
75=5*5*3
100=5*5*4
因为每加一个零相当于加一5*2的倍数,所以 100以内一共有20个5的倍数,(2的倍数不用考虑,因为太多,足够了。。)
20再加上 ...



我也帖个我的代码吧, 这个答案,变通一下,就是数一下

所求数字m以下,5的n次方的倍数和。


#!/usr/bin/perl


use strict;
use warnings;
use POSIX;

my $younu=$ARGV[0]; #//Your number input.

my $count=0;        #//Count the number of zer0


my $ln=floor(log($younu)/log(5));

for (1...$ln){
        $count+=floor($younu/pow(5,$_));
}


print $count;

论坛徽章:
0
25 [报告]
发表于 2009-12-27 18:20 |只看该作者
晕,发错了

论坛徽章:
0
26 [报告]
发表于 2009-12-29 10:12 |只看该作者

回复 #23 to407 的帖子

逢5逢0 必+1, 而 25 50 75 100比较特殊

25=5*5
50=5*5*2
75=5*5*3
100=5*5*4
因为每加一个零相当于加一5*2的倍数,所以 100以内一共有20个5的倍数,(2的倍数不用考虑,因为太多,足够了。。)
20再加上4个特殊数字。就是24

我认为这里有个错误“逢5逢0 必+1, 而 25 50 75 100比较特殊”就是“逢5逢0 必+1”里面已经包含了50,后面不应该再有50这个特殊数,所以结果应该是23。
你可以这样想10到100里有11个0,5到95里有10个5的也就有10个0,大家可以发现10到100里有50,5到95里也有50,实际上50已经算了2次,所以特殊数里就没有“50”了,只有两个特殊数“25和75”也就是再加上2个0,11+10+2=23,结果应该是23。

论坛徽章:
0
27 [报告]
发表于 2009-12-29 10:29 |只看该作者
具体怎么编程就不管了,这么想吧:
10=2*5
偶数肯定是够的,那么仅需要找出5有多少个就行了。
所有带0和带5的,全部迭代换算成:
5*X的形式,最后会发现有24个5,也就是24个0了。

论坛徽章:
0
28 [报告]
发表于 2009-12-29 11:23 |只看该作者
算有多少个5就完了。

论坛徽章:
0
29 [报告]
发表于 2009-12-29 17:10 |只看该作者

回复 #28 summerxhui 的帖子

老兄正解。我补充说一下。
自然数可以分解成素数乘积。10=2*5。所以清点有几对2*5就可以得到答案。
对于一个可以被5整除的自然数a,a-4到a+4都不能被5整除。而2则可以由与奇数间隔出现的偶数得到。所以,2是充足的。结果里有多少个0,由5的个数决定。
那么,如何计算5的个数呢。可以用递归处理。perl风格伪码如下:
$initial = 100;
$div = 5;
$sum = 0;
while ( $initial >= $div ) {
$tmp_val = $initial / ( $initial - $initial % $div );
$sum += $tmp_val;
$initial = tmp_val;
}
$sum给出结论。具体实现见下楼。

[ 本帖最后由 白丁布衣 于 2009-12-31 15:49 编辑 ]

论坛徽章:
0
30 [报告]
发表于 2009-12-29 17:31 |只看该作者

回复 #29 白丁布衣 的帖子

折腾的一点小代码。包括perl、ruby和bash实现。
perl实现:
#!/usr/bin/perl
# calculate how many zeroes in the result of the production of numbers of a range
# from 1 to one of arguments.
if ($#ARGV!=-1) {
    foreach (@ARGV) {
        if ($_<=0) {
            print "$_ is less than or equal zero\n";
        } else {
            $y=$_;
            $sum=0;
            until ($y<5) {
                $y=($y-$y%5)/5;
                $sum+=$y;
            }
            print "1~$_:$sum\n";
        }
    }
}

ruby实现:
#!/usr/bin/env ruby
# calculate how many zeroes in the result of the production of numbers of a range
# from 1 to one of arguments.
if ARGV.length >0
  ARGV.each do |x|
    if x.to_i<=0
      puts "#{x} is less than or equal zero"
    else
      y=x.to_i
      sum=0
      until y<5
        y=(y-y%5)/5
        sum+=y
      end
      puts "1~#{x}:#{sum}"
    end
  end
end

bash实现:
#!/bin/bash
# calculate how many zeroes in the result of the production of numbers of a range
# from 1 to one of arguments.
if [ ${BASH_ARGC:-0} -gt 0 ];then
    for i in $*;do
        if [ $i -le 0 ];then
            echo "$i is less than or equal zero"
        else
            y=$i
            sum=0
            until [ $y -lt 5 ];do
                y=$((($y-$y%5)/5))
                sum=$(($sum+$y))
            done
            echo "1~$i:$sum"
        fi
    done
fi

[ 本帖最后由 白丁布衣 于 2009-12-31 15:43 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP