黑马程序员技术交流社区

标题: 如何推算整数的阶乘末尾有多少个0?注:不是结果中 [打印本页]

作者: 雪风飞花    时间: 2015-4-26 22:42
标题: 如何推算整数的阶乘末尾有多少个0?注:不是结果中
上次看到一个计算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. }
复制代码
新人求给点技术分


作者: 柒夜    时间: 2015-4-26 22:45
谢谢楼主分享!
作者: 赵桂勇    时间: 2015-4-26 23:38
学到了,多谢!
作者: 喻忠航    时间: 2015-4-26 23:40
很不错的帖子  学习了!!!
作者: 雪风飞花    时间: 2015-4-26 23:43
赵桂勇 发表于 2015-4-26 23:38
学到了,多谢!

多谢顶贴:lol:lol
作者: xiejun0725    时间: 2015-4-26 23:43
学习了,++
作者: 雪风飞花    时间: 2015-4-26 23:44
喻忠航 发表于 2015-4-26 23:40
很不错的帖子  学习了!!!

:lol:lol多谢顶贴啊,有什么要顶的尽管说
作者: Dylon    时间: 2015-4-26 23:49
楼主我知道你是谁
作者: 雪风飞花    时间: 2015-4-26 23:52
Dylon 发表于 2015-4-26 23:49
楼主我知道你是谁

:lol我貌似也很眼熟你
作者: 崔小可    时间: 2015-4-27 00:11
谢谢楼主分享!
作者: yelebron    时间: 2015-4-27 00:22
牛!!!!!!!!!!!!!!!
作者: 哔哩哔哩    时间: 2015-4-27 00:27
本帖最后由 哔哩哔哩 于 2015-4-27 00:35 编辑

你确定这样能保证5跟2一对一配对?我看你是先把一个数/2分解到不能再分解,然后再/5分解,是不是应该配对分解,/2一次紧跟着/5一次
作者: 木风雪林    时间: 2015-4-27 00:43
楼主牛逼,思维扩展性真好!我当时看到这个问题,思考时就想到了中间有0,定义long数据类型都求不出来结果,然后就没有然后了。
作者: 我不信命ZW    时间: 2015-4-27 10:24
顶。写的很好。




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