黑马程序员技术交流社区

标题: 1~1000的累加乘 的积 后边有多少个零 [打印本页]

作者: 无奈的我+.l    时间: 2014-5-23 09:47
标题: 1~1000的累加乘 的积 后边有多少个零
  1. public class Test8
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int num=1;
  6.                 int z=0;
  7.         //2*5则会多一个0,因为在1-1000中因数2的数量足够多,则只需求因数5的个数即可
  8.                 for(int i=1;i<=1000;i++)
  9.                 {
  10.                                 //求出1000中所有5的倍数的值
  11.                                 num=5*num;
  12.                                 //判断5的个数
  13.                                 if(0<num && num<1000)
  14.                                         {
  15.                                 //将1000个数中不同的5的倍数中的因数5的个数相加
  16.                                                 z=1000/num+z;
  17.                                         }
  18.                 }
  19.                         //因数5的个数即为0的个数
  20.                         System.out.print(z);
  21.         }
  22. }
复制代码

这个数学思想,没有明白,请朋友们给讲下



我的思想是 先算1~1000的乘积,把乘积转换成字符串,在通过方法知道后边有多少个零,

亲们,你们能写出我想的这个代码吗?  Ps:int 是有范围的。求解答
作者: gentleman    时间: 2014-5-23 15:23
累加乘势什么
作者: Aron    时间: 2014-5-23 18:18
这个问题我给你解答  因为我就是这么写的 确实如此int的话范围不够 无法得出1000!这样大的数
但是java里面给我提供了一个专门计算大数的类型就是bigInteger 怎么很直观吧 大整型  下面就看具体代码吧 关于bigInteger有什么疑问的话可以查看API文档哈他的方法有哪些怎么用都有的
  1. public static void main(String[] args) {
  2.                 BigInteger bi = new BigInteger("1");//初始化值为1
  3.                 for(int i=2;i<1001;i++){
  4.                         bi=bi.multiply(BigInteger.valueOf(i));//这里是做乘法运算
  5.                 }
  6.                 int N=0;
  7.                 String s=bi.toString();//结果转化为字符串
  8.                 for(int i=0;i<s.length();i++){
  9.                         if(s.charAt(i)=='0'){
  10.                                 N++;//有一个0就加上1
  11.                         }
  12.                 }
  13.                 System.out.println("1000!中共有0的个数为:"+N);
  14.         }
复制代码

简单  容易理解 希望采纳 谢谢
作者: Aron    时间: 2014-5-23 19:13
最开始恢复了不知道为什么说要审查一直都没下来 重新给你写一个吧  我直接贴上我自己写的代码 这里用到一个bigInteger的类型很直观就是大整型 没有上限只要你内存足够大 数字可以无限大 下面是代码 具体用发可以私聊或者你去查API都没问题
  1. public static void main(String[] args) {
  2.                 BigInteger bi = new BigInteger("1");//初始化值为1
  3.                 for(int i=2;i<1001;i++){
  4.                         bi=bi.multiply(BigInteger.valueOf(i));//这里是做乘法运算
  5.                 }
  6.                 int N=0;
  7.                 String s=bi.toString();//结果转化为字符串
  8.                 for(int i=0;i<s.length();i++){
  9.                         if(s.charAt(i)=='0'){
  10.                                 N++;//有一个0就加上1
  11.                         }
  12.                 }
  13.                 System.out.println("1000!中共有0的个数为:"+N);
  14.         }
复制代码

作者: 向前看向前走    时间: 2014-5-23 21:46
留名以后做
作者: 李维奥    时间: 2014-5-23 21:49
字符串的代码是这样的,不知道是这个意思不?
  1. class Test
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int sum=0;
  6.                 //定义计数器
  7.                 int count=0;

  8.                 //计算1-1000的和
  9.                 for (int i=0;i<1000 ; i++)
  10.                 {
  11.                         sum=sum+i;
  12.                 }
  13.                
  14.                 //转换成字符串
  15.                 String s =new Integer(sum).toString();
  16.                
  17.                 //转换成字符数组
  18.                 char[] ch =s.toCharArray();

  19.                 //从后往前遍历数组,如果为0计数器+1
  20.                 for (int i =ch.length-1;i>0;i-- )
  21.                 {
  22.                         if(ch[i]=='0')
  23.                                 count++;
  24.                                
  25.                 }
  26.                         System.out.println("0的个数两个"count);
  27.         }
  28. }
复制代码

作者: 294645832    时间: 2014-5-24 00:06
李维奥 发表于 2014-5-23 21:49
字符串的代码是这样的,不知道是这个意思不?

一楼说的是乘法  我刚开始也看了一下写出了大部分代码 但是在容器那里卡住了
作者: 肥洋洋    时间: 2014-5-24 00:22
  1. import java.math.*;
  2. public class Text9 {
  3.         public static void main(String[] args) {
  4.                 int num=1000;

  5.                 //定义一个大整数,存储1000!的结果
  6.                 BigInteger res=new BigInteger("1");
  7.                 for(int i=1;i<=num;i++)
  8.                 {

  9.                         //计算1000!的阶层,将结果存储在res中
  10.                         BigInteger number=new BigInteger(String.valueOf(i));
  11.                         res=res.multiply(number);
  12.                 }

  13.                 //将结果转换成字符串,存在S中
  14.                 String s=res.toString();
  15.                 System.out.println(num+"!的结果是:");
  16.                 System.out.println(s);
  17.                 //count统计0的个数
  18.                 int count=0;
  19.                 for (int i = 0; i < s.length(); i++) {

  20.                         //遍历字符串中的所有字符,如果字符为0,count++
  21.                         if(s.charAt(i)=='0')
  22.                                 count++;                       
  23.                 }System.out.println(num+"!中共有:"+count+"个0");       
  24.         }
  25. }
复制代码
//int只能存储32位,要用大整数BigInteger,这个代码可以算出来哦,希望可以帮到你
作者: 肥洋洋    时间: 2014-5-24 00:24
  1. import java.math.*;
  2. public class Text9 {
  3.         public static void main(String[] args) {
  4.                 int num=1000;

  5.                 //定义一个大整数,存储1000!的结果
  6.                 BigInteger res=new BigInteger("1");
  7.                 for(int i=1;i<=num;i++)
  8.                 {

  9.                         //计算1000!的阶层,将结果存储在res中
  10.                         BigInteger number=new BigInteger(String.valueOf(i));
  11.                         res=res.multiply(number);
  12.                 }

  13.                 //将结果转换成字符串,存在S中
  14.                 String s=res.toString();
  15.                 System.out.println(num+"!的结果是:");
  16.                 System.out.println(s);
  17.                 //count统计0的个数
  18.                 int count=0;
  19.                 for (int i = 0; i < s.length(); i++) {

  20.                         //遍历字符串中的所有字符,如果字符为0,count++
  21.                         if(s.charAt(i)=='0')
  22.                                 count++;                       
  23.                 }System.out.println(num+"!中共有:"+count+"个0");       
  24.         }
  25. }
复制代码
//用大整数可以存哦,希望可以帮到你
作者: 肥洋洋    时间: 2014-5-24 00:31
  1. import java.math.*;
  2. public class Text9 {
  3.         public static void main(String[] args) {
  4.                 int num=1000;

  5.                 //定义一个大整数,存储1000!的结果
  6.                 BigInteger res=new BigInteger("1");
  7.                 for(int i=1;i<=num;i++)
  8.                 {

  9.                         //计算1000!的阶层,将结果存储在res中
  10.                         BigInteger number=new BigInteger(String.valueOf(i));
  11.                         res=res.multiply(number);
  12.                 }

  13.                 //将结果转换成字符串,存在S中
  14.                 String s=res.toString();
  15.                 System.out.println(num+"!的结果是:");
  16.                 System.out.println(s);
  17.                 //count统计0的个数
  18.                 int count=0;
  19.                 for (int i = 0; i < s.length(); i++) {

  20.                         //遍历字符串中的所有字符,如果字符为0,count++
  21.                         if(s.charAt(i)=='0')
  22.                                 count++;                       
  23.                 }System.out.println(num+"!中共有:"+count+"个0");       
  24.         }
  25. }
复制代码
要用大整数来存储就可以了,我的基础题测试也有这个
作者: gentleman    时间: 2014-5-24 07:22
本帖最后由 gentleman 于 2014-5-24 12:39 编辑

大家看看我的做法怎么样,感觉效率比较高,(不建议全部算出来,因为要的只是零的个数,字符运算效率低,望采纳!
  1. public class test {
  2.          public static void main(String[] args)  {
  3.          int mul=1,num=0,end=1000;
  4.           for(int i=2;i<=end;i++) {
  5.                  mul=mul*i;
  6.                  //除去乘积后面所有0,并累加这些0
  7.                  while(mul%10==0){
  8.                      mul=mul/10;
  9.                          num++;
  10.                  }
  11.                  //取得最后四位非零数字,因为下一个乘积末尾是否有0只与末尾四位数有关
  12.                  mul=mul%1000;
  13.            }
  14.          System.out.println(end+"的阶乘,共有"+num+"个零");
  15. }

  16. }
复制代码

经过无数次的调试,现在可以用了

作者: youcyou    时间: 2014-5-24 08:24
楼主看一下吧,个人觉得比较好理解

  1. public class Jiecheng {

  2.         public static void main (String args[])
  3.         {
  4.                 //M为要测试的范围1-M,这里假定最大是四位数的
  5.                 int m=100;
  6.                 //一下变量分别计末尾为5,0,00,000的数的个数
  7.                 int count5 =0;
  8.                 int count0 = 0;
  9.                 int count00 =0;
  10.                 int count000 =0;
  11.                 //遍历整个范围 ,求个各个变量的值
  12.                 for(int i=1;i<=m;i++)
  13.                         {        if(i%1000==0)
  14.                                 {
  15.                                         count000++;
  16.                                         continue;
  17.                                 }
  18.                                 if(i%100==0)
  19.                                 {
  20.                                         count00++;
  21.                                         continue;
  22.                                 }
  23.                                 if(i%10==0)
  24.                                 {
  25.                                         count0++;
  26.                                         continue;
  27.                                 }
  28.                                 if(i%5==0)
  29.                                 {
  30.                                         count5++;
  31.                                         continue;
  32.                                 }
  33.                         }
  34.                
  35.                 //每一个整千的数会带来三个0,整百的会带来两个,整十的会带来一个,而由于数据中有充足的2和2的倍数存在,所以每一个五也会有一个0
  36.                 //所以输出如下
  37.                 System.out.println("0的个数为"+(count000*3+count00*2+count0+count5));
  38.         }       
  39. }
复制代码

作者: 无奈的我+.l    时间: 2014-5-24 09:50
Aron 发表于 2014-5-23 18:18
这个问题我给你解答  因为我就是这么写的 确实如此int的话范围不够 无法得出1000!这样大的数
但是java里 ...

明白了,赞
作者: 无奈的我+.l    时间: 2014-5-24 09:52
李维奥 发表于 2014-5-23 21:49
字符串的代码是这样的,不知道是这个意思不?

你这个和楼上的思想一样,只是int型是有范围的  累加乘的话,定义int是不行的
作者: 247033993@qq.co    时间: 2014-5-24 10:29
算出结果?那得多大数字?
作者: zhrnghgwsws    时间: 2014-5-25 00:32
学习一下。
作者: yinxjfly    时间: 2014-6-1 12:47
Aron 发表于 2014-5-23 18:18
这个问题我给你解答  因为我就是这么写的 确实如此int的话范围不够 无法得出1000!这样大的数
但是java里 ...

这个方法最容易理解!很赞哦!
作者: 27ZJQ    时间: 2014-6-11 23:06
gentleman 发表于 2014-5-24 07:22
大家看看我的做法怎么样,感觉效率比较高,(不建议全部算出来,因为要的只是零的个数,字符运算效率低,望 ...

确实精简高效!
作者: 寐海流风    时间: 2014-6-12 11:09
铁血丹心 发表于 2014-5-25 00:24
楼主的程序我也没看懂,自己写的,思路写的长点,大家好看一些。大家看一下有啥不对的地方没 ...

这么帅的思路。代码很精辟。
作者: peterbu    时间: 2014-6-12 15:20
不是很懂啊
作者: №星晨∮    时间: 2014-6-30 14:41
铁血丹心 发表于 2014-5-25 00:24
楼主的程序我也没看懂,自己写的,思路写的长点,大家好看一些。大家看一下有啥不对的地方没 ...

佩服算法厉害的,从本质分析问题,而不是从表面的方法解决
作者: №星晨∮    时间: 2014-6-30 15:18
gentleman 发表于 2014-5-24 07:22
大家看看我的做法怎么样,感觉效率比较高,(不建议全部算出来,因为要的只是零的个数,字符运算效率低,望 ...

你的方法跟一楼算法哥可以媲美
作者: 一只特立独行的猪    时间: 2014-6-30 15:46
Aron 发表于 2014-5-23 18:18
这个问题我给你解答  因为我就是这么写的 确实如此int的话范围不够 无法得出1000!这样大的数
但是java里 ...

楼主的代码是对的,你这个代码有一点点小问题。最后答案应该是249个,上面这个运行得出的是472个,稍分析可知,题目要求的是乘积最后有多少个0,也就是能被10的多少次方整除,这个代码里遍历了结果的每一位,只要有0就计数,假设结果是2340003200应该输出2而不是5.修改部分代码即可满足。将for循环用下面代码替换:
  1.         int len = s.length()-1;
  2.         while(s.charAt(len) == '0')// 遇到第一个不为0的位置就结束循环
  3.         {
  4.                 N++; // 计数
  5.                 len--;// 从后往前遍历
  6.         }
复制代码

作者: snowaves    时间: 2014-6-30 17:48
{:3_68:}只需要找出5的整数倍的个数,然后100的倍数个数,1000的倍数个数这些就好做了
作者: 咪啪    时间: 2014-6-30 23:35
本帖最后由 咪啪 于 2014-6-30 23:36 编辑

任意一个数能分解成素数的乘积 ,(其中p为素数),只有2*5会得到0,且0乘任意数还是0,因此只要看min{2的指数,5的指数}


作者: 多一点    时间: 2014-7-1 00:46
我的个人思路:0的个数是由5来控制,而不是2来控制,2比5多,有多少个5就有多少个零
int num5 = 0;
        double count = 2;
        while (count <= 1000)
        {
            double numtemp = count;
           while(numtemp>=2)
            {
                if (numtemp % 5 == 0)
                {
                    num5++;
                    numtemp = numtemp / 5;

                }else{
                    break;
                }
            }
            count++;

        }


作者: 逍遥客    时间: 2014-8-11 10:07
收藏下,以后忽悠小朋友
作者: Fightin黑马    时间: 2014-8-28 15:28
247033993@qq.co 发表于 2014-5-24 10:29
算出结果?那得多大数字?

没多少的,1000!里面总共包含472个0
作者: 静水流华    时间: 2014-9-26 18:47
我也有这道题
作者: 静水流华    时间: 2014-9-26 21:22
铁血丹心 发表于 2014-5-25 00:24
楼主的程序我也没看懂,自己写的,思路写的长点,大家好看一些。大家看一下有啥不对的地方没 ...

你用计算机算算15!看看结果中有多少个0
作者: inception    时间: 2014-10-10 10:23
1*2*3*4*6*7=1008
作者: ZZT    时间: 2016-4-29 19:28
好难哦





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