黑马程序员技术交流社区
标题:
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时
try{
while(n%m == 0){//能被m整除则count++
count++;
if(n >= m){
n /= m;
}
复制代码
这个代码是一个死循环,n一直为1000,m一直为1,且n%m一直成立,因此运行不会结束
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2