A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 实战造就实力 中级黑马   /  2013-12-13 17:08  /  1280 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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");
}
}
请问这段代码 为什么不能运行

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

2 个回复

倒序浏览
本帖最后由 回音 于 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的话,没必要写异常检测,不会抛出异常的。





评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
楼上回答很好,再补充几点不能运行的原因:
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一直成立,因此运行不会结束

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马