黑马程序员技术交流社区

标题: 1000!末尾的0个数疑问 [打印本页]

作者: 实战造就实力    时间: 2013-12-13 17:08
标题: 1000!末尾的0个数疑问
package addtest;
public class SumZero {
SumZero(){
  max = 1000;//默认值是1000
}


private int max;
/**
  * 得到max的因子 m 的个数
  */
public int getFactor(int m){
  int count = 0, n = max;


  //try 中的便是程序的核心
  try{
  while(n%m == 0){//能被m整除则count++
  count++;
  if(n >= m){
    n /= m;
  }
  }
  }
  catch(Exception e){
  e.printStackTrace();
  }

  return count;   
}

/**
  * 得到末尾0的个数
  */
public int getNumber(){
  int count_2 = 0,//因子2的个数
    count_5 = 0;//因子5的个数

  for(int i = 1;i<=max;i++){
  //count_2 += getFactor(i);//其实没有必要求因子2的个数
  count_5 += getFactor(i);
  }

  return Math.min(count_2,count_5);//必定有:count_5 < count_2
}
public static void main(String[] args){
  System.out.println("1*2*...*1000的末尾有"
                        +new SumZero().getNumber()
                        +"个0");
}
}
请问这段代码 为什么不能运行


作者: 回音    时间: 2013-12-13 17:39
本帖最后由 回音 于 2013-12-13 17:54 编辑

精简而且修改了一下你的代码:public class test2 {

    private static int max = 1000;

    public static int getFactor(int m)
    {
      int count = 0;

        while(m%5 == 0)
        {
            count++;
            if(m >= 5)
            {
                m = m / 5;
            }
        }

      return count;   
    }

    public static int getNumber()
    {
      int count_5 = 0;

      for(int i = 1;i<=max;i++)
      {
        count_5 += getFactor(i);
      }

      return count_5;
    }
    public static void main(String[] args)
    {
        System.out.println("1*2*...*1000 end has "+test2.getNumber()+"s 0");
    }
}

结果显示有249个0。有好几个问题呢:
(1)整个代码中的动态方法和属性全要改成静态的,否则不能调用。主方法里用类名.方法名调用静态方法;
(2)是不是数一下因子5的总数量就好了?那就不用n了,直接除5;
(3)如果是m除5的话,没必要写异常检测,不会抛出异常的。






作者: 熊猫86    时间: 2013-12-13 18:20
楼上回答很好,再补充几点不能运行的原因:
1、//count_2 += getFactor(i);这句话你给注释掉了,而之前又已经给其赋值为0,所以return Math.min(count_2,count_5);的执行结果不会比0大。。。
2、其实,最主要的原因是,当i=1时
  1. try{
  2.   while(n%m == 0){//能被m整除则count++
  3.   count++;
  4.   if(n >= m){
  5.     n /= m;
  6.   }
复制代码

这个代码是一个死循环,n一直为1000,m一直为1,且n%m一直成立,因此运行不会结束




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2