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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

上次看到一个计算1000阶乘的结果中有多少个0的例子,刚开始还以为是计算末尾的呢,结果发现不是,到是发现一种简便的推算阶乘末尾0的算法。下面来看看这种算法的思路。     思路:
          要算末尾有多少个0其实就是算5和2相乘的个数,因为每一对5和2相乘的数是10.就会有一个0出现在末尾。这样想,我们就能将任何数的阶乘分开,一个个的数的推算,看看它们能被2和5各除多少次。然后看能被2和5整除的次数,取这两个数中被整除最少的,进行累加,最后,将取到的数相加起来得到的和就是末尾能有多少个0.
     步骤:
        1.因为是不确定的数,所以先要创建一个键盘接收器
        2.然后创建一个没有返回值的函数,接收从键盘上输入的数
        3.在函数中定义三个变量,分别存储能被2和5整除的次数和这两个数的和
        4.用一个循环输出从1开始到这个数时的每一个整数
        5.用循环因为不知道次数所以用while循环判断它能被2和5整除的次数,并取它们中能被整除最少次数的那个数
        6.统计结果并输出
代码如下:
  1. import java.util.Scanner;
  2. public class Test {

  3.         public static void main(String[] args) {
  4.                 //封装一个键盘
  5.                 Scanner input = new Scanner(System.in);

  6.                 //提示能要计算计算阶乘末尾0的个数的数
  7.                 System.out.println("请输入要计算阶乘末尾0的个数的数:");
  8.                 int num = input.nextInt();
  9.                
  10.                 //调用这个方法
  11.                 facSum(num);
  12.                
  13.                
  14.         }
  15.         public static void facSum(int number ){
  16.                 // 被2整除的次数之和
  17.                 int count2 = 0;

  18.                 // 被5整除的次数之和
  19.                 int count5 = 0;

  20.                 // 统计結果得到的和
  21.                 int count = 0;

  22.                 // 遍历所有的数
  23.                 for (int i = 1; i <= number; i++) {

  24.                         // 将i赋给一个变量
  25.                         int num = i;

  26.                         // 统计该数能被2整除多少次,并统计累加结果
  27.                         while (num % 2 == 0) {
  28.                                 count2++;
  29.                                 num /= 2;
  30.                         }

  31.                         // 统计该数能被5整除多少次,并统计累加结果
  32.                         while (num % 5 == 0) {
  33.                                 count5++;
  34.                                 num /= 5;
  35.                         }
  36.                 }

  37.                 // 将得到的数赋给0的计数器
  38.                 count = (count2 <= count5) ? count2 : count5;

  39.                 // 打印输出阶乘后0的个数
  40.                 System.out.println("结尾0的个数为:" + count);

  41.         }
  42. }
复制代码
新人求给点技术分

评分

参与人数 2黑马币 +10 收起 理由
Archer + 4
高光天 + 6 很给力!

查看全部评分

15 个回复

倒序浏览
谢谢楼主分享!
回复 使用道具 举报
学到了,多谢!
回复 使用道具 举报
很不错的帖子  学习了!!!
回复 使用道具 举报

多谢顶贴:lol:lol
回复 使用道具 举报
xiejun0725 来自手机 中级黑马 2015-4-26 23:43:54
地板
学习了,++
回复 使用道具 举报
喻忠航 发表于 2015-4-26 23:40
很不错的帖子  学习了!!!

:lol:lol多谢顶贴啊,有什么要顶的尽管说
回复 使用道具 举报
Dylon 中级黑马 2015-4-26 23:49:45
8#
楼主我知道你是谁
回复 使用道具 举报
Dylon 发表于 2015-4-26 23:49
楼主我知道你是谁

:lol我貌似也很眼熟你
回复 使用道具 举报
谢谢楼主分享!
回复 使用道具 举报
牛!!!!!!!!!!!!!!!
回复 使用道具 举报
本帖最后由 哔哩哔哩 于 2015-4-27 00:35 编辑

你确定这样能保证5跟2一对一配对?我看你是先把一个数/2分解到不能再分解,然后再/5分解,是不是应该配对分解,/2一次紧跟着/5一次

点评

明白了,按2分解一定会得出一个奇数,如果能被5整除,一定是5结尾,所以按2分解直到分解成一个奇数就可以  发表于 2015-4-27 00:58
你仔细看代码,是两个while循环,分开的,一个循环完了才走下一个的这样就能陪到一对了  发表于 2015-4-27 00:41
回复 使用道具 举报
楼主牛逼,思维扩展性真好!我当时看到这个问题,思考时就想到了中间有0,定义long数据类型都求不出来结果,然后就没有然后了。
回复 使用道具 举报
顶。写的很好。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马