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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

©   /  2014-5-23 09:47  /  5836 人查看  /  36 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

  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. }
复制代码

楼主的程序我也没看懂,自己写的,思路写的长点,大家好看一些。大家看一下有啥不对的地方没

点评

15的阶乘算出来就4个0了  发表于 2014-9-26 21:25

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 1
用我刚才发的方法写的求任意两个整数之间数的乘积的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. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马