黑马程序员技术交流社区

标题: 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
算出结果?那得多大数字?
作者: 铁血丹心    时间: 2014-5-25 00:24
  1. /**
  2. * 需求:求1到1000乘积的0的个数
  3. * 思路:假设乘积结果是。。。。。000000000,每一个0就相当于乘与10,1到1000的乘积可以等同于将1到1000这些数字完全分解成质数再相乘
  4. * 1=        1*1
  5. * 2=        1*2
  6. * 3=        1*3
  7. * 4=        2*2
  8. * 5=        1*5
  9. * 6=        2*3
  10. * 。
  11. * 。
  12. * 10=        2*5
  13. * 11=        1*11
  14. * 12=        2*3*4
  15. * .
  16. * .
  17. * 15=        3*5
  18. * .
  19. * .
  20. * 20=        2*2*5
  21. * 。
  22. *
  23. * 25=        5*5。
  24. *
  25. * 1000=        2*2*2*5*5*5
  26. * 就是将上面的等号右边的所有数乘起来。我们知道乘积中出现一个10,就会多一个0.而10=2*5,只有2和5乘积才能等于10,其他所有的数的乘积都不等于10。
  27. * 不要说10*20也会有0,要知道我们已经将这些数字完全分解成了质数,所以只要求出上面等号右边能构造成多少个(2*5),明显可以看出2的个数多于5,所以
  28. * 我们只要求出5的个数就是(2*5)的个数,也就是乘积中10的个数,也就是要求的0的个数。
  29. * 怎么求5的个数,楼主的程序我也没看懂。不过我自己想了一种,大家看一下。
  30. * 1.首先只要5的倍数,分解的质数里才会包含5,即
  31. * 5 =        1*5
  32. * 10=        2*5
  33. * 15=         3*5
  34. * 20=        4*5
  35. * .    .
  36. * .        .
  37. * 1000=200*5
  38. * 上面的等号右边我们直观的可以看到已经有200个5,再求1到200分解成5的倍数
  39. *  5 =        1*5
  40. * 10=        2*5
  41. * 15=         3*5
  42. * 20=        4*5
  43. * .    .
  44. * .        .
  45. * 200=        40*5
  46. * 上面上面又有40个5,再求出1到40分解成5的倍数
  47. *  5 =        1*5
  48. * 10=        2*5
  49. * 15=         3*5
  50. * 20=        4*5
  51. * 。
  52. * 40=        8*5
  53. * 上面有8个5,再求1到8分解成5的倍数
  54. * 5=        1*5
  55. * 上面就1个5
  56. * 所以5的个数=200+40+8+1=249
  57. * 步骤:
  58. *
  59. * @author lhy
  60. *
  61. */
  62. public class Test8
  63. {
  64.         public static void main(String[] args)
  65.         {
  66.                 int num=0;//创建变量记录5的个数
  67.                 int z=1000;
  68.                
  69.                 while(z>=5){
  70.                         num = z/5 +num;//第一次是200,第二次是40,第三次是8,其实都是除于5得到的
  71.                         z = z/5;
  72.                 }
  73.                         System.out.print(num);
  74.         }
  75. }
复制代码

楼主的程序我也没看懂,自己写的,思路写的长点,大家好看一些。大家看一下有啥不对的地方没
作者: zhrnghgwsws    时间: 2014-5-25 00:32
学习一下。
作者: 铁血丹心    时间: 2014-5-25 01:29
用我刚才发的方法写的求任意两个整数之间数的乘积的0的个数,不用做乘法,求debug
  1. /**
  2. *需求:给出任意两个整数,求这两个整数之间(包括这两个数)所有数的乘积的零的个数
  3. * 根据之前的分析,第一轮5的个数是1000/5 - 200/5 +1,加不加1,要看min这个数是不是5的倍数,不是则不用加1
  4. * 用下面注释掉的语句,先给  min - 1后再求5的倍数,可以不使用加1的判断。
  5. *
  6. */
  7. public class test {
  8.         public static void main(String[] args) {
  9.                 int num = 0;// 创建变量记录5的个数
  10.                 int min = 200;
  11.                 int max = 1000;

  12.                 while (min >= 5) {
  13.                         if (min % 5 == 0) {

  14.                                 num = max / 5 - min / 5 + 1 + num;
  15.                         } else {
  16.                                 num = max / 5 - min / 5 + num;
  17.                         }
  18.                         max = max / 5;
  19.                         min = min / 5;
  20.                 }

  21.                 /*while (min >= 5) {

  22.                         num = max / 5 - (min - 1) / 5 + num;
  23.                         max = max / 5;
  24.                         min = min / 5;
  25.                 }
  26. */
  27.                 while (max >= 5) {
  28.                         num = max / 5 + num;
  29.                         max = max / 5;
  30.                 }
  31.                 System.out.print(num);
  32.         }
  33. }
复制代码

作者: 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