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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 七弦   /  2014-5-26 20:48  /  6199 人查看  /  39 人回复  /   4 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 七弦 于 2014-6-29 15:00 编辑

。。。。。。。。。。。。。。。。。
回复 使用道具 举报
本帖最后由 七弦 于 2014-6-29 15:00 编辑

。。。。。。。。。。。。。。。。。
回复 使用道具 举报
前来观摩
回复 使用道具 举报
本帖最后由 韩长征 于 2014-5-28 09:29 编辑

看了楼上几位的代码和思想,感觉自己的太过于狭隘了。当然也收获不少。
总结一下2*5*10的思想,其实就是在求1-n直接由多少个5的倍数。
当5的倍数为奇数时,表示肯定包含一个2*5.
当5的倍数为偶数时,表示肯定包含一个*10
于是将代码更新,加入了0和负数,负数默认为-1*-2*-3......
  1. public static void getEndZero_3(int x){
  2.                 if(x==0){
  3.                         System.out.println(1);
  4.                 }
  5.                 if(x<0){
  6.                         x=0-x;
  7.                         getEndZero_3(x);
  8.                 }
  9.                 else{
  10.                         int count = 0;
  11.                         for(int y=1;y<=x;y++){
  12.                                 if(y%5==0){
  13.                                         count++;
  14.                                 }
  15.                         }
  16.                         System.out.printlncount);
  17.                 }
  18.         }
复制代码



回复 使用道具 举报
大家好哇,混个脸熟
回复 使用道具 举报
铁血丹心 发表于 2014-5-27 21:48
这个题不能硬做乘法啊,发这个大家看懂就会做啦

只有一个字,顶!
回复 使用道具 举报
刚重装系统没有Eclipse,用记事本凑合一下,谁帮我运行看看。。。

  1. public class FactorialZeros {

  2.         public static void main(String[] args) {
  3.                 int num = 1000;
  4.                 System.out.println(getZeros(num));
  5.         }

  6.         public static int getZeros(int num) {       
  7.                 int count = 0;
  8.                 for(int i=1; i<=num; i++) {
  9.                         count += getnFive(i);
  10.                 }
  11.                 return count;       
  12.         }

  13.         private static int getnFive(int num) {
  14.                 int count = 0;
  15.                 if((num % 5) == 0) {
  16.                         count++;                         
  17.                         count += getnFive(num / 5);
  18.                 }
  19.                 return count;
  20.         }
  21. }
复制代码
回复 使用道具 举报
用Bigdecimal
回复 使用道具 举报
貌似见过啊 赞一个 好题
回复 使用道具 举报
看来各位都是高手级别的。
回复 使用道具 举报
韩长征 发表于 2014-5-28 09:17
看了楼上几位的代码和思想,感觉自己的太过于狭隘了。当然也收获不少。
总结一下2*5*10的思想,其实就是在 ...

0是没有阶乘的
回复 使用道具 举报
昨天刚刚做了这道题   呵呵 分享了  不对之处还望指教

public class Test9 {
       
        static int i2 = 0;
        static int j5 = 0;

        public static void main(String[] args) {
               
                int input_number;
                System.out.println("请输入一个整数:");
                Scanner san = new Scanner (System.in);
                input_number = san.nextInt();
               
                for(int i=1;i<=input_number;i++)
                {
                        returnI2(i);
                        returnJ5(i);
                       
                }
                if(i2>=j5)
                {
                        System.out.println(input_number+"的阶乘的结果中包含"+j5+"个0!");
                }
                else
                {
                        System.out.println(input_number+"的阶乘的结果中包含"+i2+"个0!");
                }
        }
       
       
        public static  void  returnI2(int a)
        {
                if(a%2==0)
                {
                        i2++;
                        returnI2 (a/2);
                       
                }
                else
                {
                        i2 = i2;
                }
        }
        public static void  returnJ5(int a)
        {
                if(a%5==0)
                {
                        j5++;
                        returnJ5 (a/5);
                       
                }
                else
                {
                        j5 = j5;
                }
        }
       

}
回复 使用道具 举报
递归·········
回复 使用道具 举报
递归有次数限制,数字过大了就算不出来了。
回复 使用道具 举报
Mark,过后来研究研究!
回复 使用道具 举报
vampire.007 发表于 2014-5-27 13:00
如果超出了BigInteger呢?这个要想真的很好的解决,我觉得还是要先转化为字符转来解决,毕竟字符串的长度 ...

BigInteger的长度是可变的,我问老师它的长度最长有多长,老师说取决于你电脑内存的大小,自己做了下试验,反正求10000的阶层没啥问题
回复 使用道具 举报
牛...谢谢
回复 使用道具 举报
学习了,谢谢
回复 使用道具 举报
bww 初级黑马 2015-3-16 15:55:17
39#
看了这么多没有一个正确的答案。蛮力计算的自己去面壁去,你算出来了这样的面试也不会让你过的,没思想;统计2和5的个数,因为5肯定比2少,所以只需要统计5的个数,但是这样的结果只是统计出阶层结果中到底有多少个0,例如20! 存在0不连续的情况~ 不合题意
回复 使用道具 举报
bww 初级黑马 2015-3-17 13:09:04
40#
bww 发表于 2015-3-16 15:55
看了这么多没有一个正确的答案。蛮力计算的自己去面壁去,你算出来了这样的面试也不会让你过的,没思想;统 ...

昨天被前面的误导了,当然自己思考也不周全,进位的0目前是不可预估的,但是也是不可能进入后续连续的尾数0中的。所以统计5的个数就行了,但是楼上没有写完整的,现给出自己的两种实现(真心不愿意打开myeclipse,所以用C实现):
int GetCountOf5(int n)
{
    int i, res = 0;
    for(i = 5; i <= n; i += 5)
    {
        int temp = i;
        while(temp%5 == 0)
        {
            res++;
            temp /= 5;
        }
    }
    return res;
}

int GetCountOfFive(int n)
{
    int i, res = 0, maxNum = 0;
    if(n < 5)
        return 0;
    for(i = n; i > n-5; i--)
    {
        if(i%5 == 0)
        {
            maxNum = i;
            break;
        }
    }
    res += maxNum/5;
    res += GetCountOfFive(maxNum/5);
    return res;
}
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 加入黑马