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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邵景伦 中级黑马   /  2014-3-21 11:21  /  1761 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 何伟超 于 2014-3-23 00:31 编辑

1*2*3*4....*999*1000中含有多少零?

10 个回复

倒序浏览
我也在做这个题  我也想问问 1000!的末尾有几个零呢   
回复 使用道具 举报
这个好像定义长整型都存不下。大概在66的时候就溢出了。
public class Demo {
        public static void main(String [] args)
        {
                long sum=1l;int count=0;
                for(int i=1;i<=65;i++)
                {
                       
                        sum=i*sum;
                       
                }
                System.out.println(sum);
        }

}

结果:-9223372036854775808

求大神指导吧


评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
个人认为只要查找1~1000中有多少个5的倍数就能迅速找到有几个零
个位5------------->100个
个位0,十位不为0------------->90个
整百------------------------->9个
整千--------------------->1个
这里面最难得是算5
大致思路是这样

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
硬算是算不了的,需要技巧。* 最后的结论是:可以转换成求1到1000中能被5整除并且因子是5的个数。
                 *
                 * 首先知道这,就可以只测试5的整数倍的数。
                 * 如果是5的倍数,就循环除以5再测试,只到不是5的整数倍为止,而每一次的测试就表示会有一个0的出现,count就自加1.
                 */

        public static void main(String[] args) {
               
                int count=0;//计数器

                for(int x = 1; x <= 1000; x++){
                        //只测试5的整数倍的数
                        if((x%5)==0){
                                count = test(x,count);
                        }
                }
                System.out.println(count);//结果显示249
        }
        public static int test(int num,int count){
                //如果num是5的整数倍
                //while( (num%5)==0 && (num/5) >=1 ){
                while( (num%5)==0){
                        count++;
                        num/=5;
                       
                        //625         625 125 25 5 1
                        //125        5x5x5
                        //30        5x6
                        //75        5x5x5
                        //15        3x5
                        //130        5x26
                }
                return count;
        }

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
  1. package cn.itcast.bank;

  2. public class test {
  3.         public static void main(String[] args){
  4.                 //跟基础测试题里面含7 。3的那道题没多大区别啊
  5.                 //首先遍历获取全部的数字
  6.                 int count = 0;
  7.                 for(int i=1 ; i <= 1000; i++){
  8.                         String s = String.valueOf(i);
  9.                         //把数字转成字符,判读出所有含有0的字符
  10.                         if(s.contains("0")){
  11.                                 char c = '0';
  12.                                 //把字符转换成char数组
  13.                                 char[] chars = s.toCharArray();
  14.                                 for(int j = 0; j < chars.length; j++)
  15.                                  {
  16.                                         //判断数组中每个字符是否为0
  17.                                      if(c == chars[j])
  18.                                      {
  19.                                         count++;
  20.                                            
  21.                                      }
  22.                             }
  23.                         }else{
  24.                                 System.out.println("没有0,我是"+ Integer.parseInt( s ));
  25.                         }
  26.                 }
  27.                 System.out.println(count);
  28.                
  29.         }
  30. }

复制代码

代码加注释,,介个不需要解释了吧。。。呵呵!

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
董振冬 发表于 2014-3-21 16:05
代码加注释,,介个不需要解释了吧。。。呵呵!

简单高效!
回复 使用道具 举报
本帖最后由 青木郎 于 2014-3-21 16:24 编辑

一共有237个0
具体思路:
在1~1000的数字中;一眼能看到带0的数字有整千,整百,整十,以及和5相乘的数
序列一:个位5-  100个)(15,25……)
序列二:个位0,十位不为0------------->90个--->90个0
序列三:整百------------------------->9个------>18个0
序列四:整千--------------------->1个----------->3个0
序列五:1~1000,除了整十整百整千,剩下的偶数;
所以现在能直观的看到111个0
在序列一中找我们有用的是5,所以全部分解,最后得到125个5
在序列二中找我们有用的,全部分解我们得到83个2
在序列三中,同理我们得到1个5,7个2
序列四没有有用的
序列五,得到了至少超过50个2
最后我们得到126个5,大于126个2,这样我们又得到126个0
最后一共237个0

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
tcny 中级黑马 2014-3-21 22:00:53
9#
  1. public class Test5 {

  2.         //计算能够被n整除的个数
  3.         static int getDiv(int n){
  4.                 int temp = 0;
  5.                 for(int i = 1; i <= 1000; i++){
  6.                         if(i%n == 0){
  7.                                 temp++;
  8.                         }
  9.                 }
  10.                 return temp;
  11.         }
  12.         public static void main(String[] args) {

  13.                 int n = 5;
  14.                 int num = 0;
  15.                 //遍历5,25,125,625……不超过1000
  16.                 for(int i = n; i <= 1000; i*=5){
  17.                         num += getDiv(i);
  18.                 }
  19.                 System.out.println("!1000的末尾有"+num+"个零.");
  20.         }
  21. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 my_android_drea 于 2014-3-21 23:58 编辑

其实只需要找总共有多少个5相乘即可。把所有5的倍数拆开,计算该倍数有几个5相乘,同理,求2的个数,(为什么要求5和2的个数呢?因为5x2=10 啊!!!)但是2的个数明显比5多,所以,计算5即可!例如:15=3x5 (一个5);   25=5x5 (两个5),如此类推!

上面有几个程序都是这个原理!!
  1. public class Test{

  2. //     计算5的倍数中有几个5相乘!返回个数!
  3.         static int getNumbleOf(int n){
  4.                
  5.       int num=0;
  6.       while((n%5)==0){
  7.                      
  8.           n=n/5;
  9.           num++;        
  10.          
  11.       }
  12.                    return num;
  13.    }
  14.    public static void main(String[] args) {

  15.        int num = 0;
  16.                
  17.        for(int i = 1; i <=1000; i++){
  18.                         
  19.            if((i%5)==0){                                      //筛选5的倍数
  20.                      
  21.                num += getNumbleOf(i);
  22.            }
  23.        }
  24.        System.out.println("!1000的末尾有"+num+"个零.");
  25.    }
  26. }
复制代码
回复 使用道具 举报
谢谢支持
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马