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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 人心如水 中级黑马   /  2014-6-11 18:27  /  2352 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package com.itheima;

/*
* 9、 求1000!的结果中包含多少个0?注:1000! = 1×2×3×4×5×...×999×1000
*/

/*
* 思路,打印出结果,把结果每个整数单位转换为数组元素,然后遍历,出现0计数一次。
*/
public class Test9{
        public static void main(String[] args) {
                //先循环遍历出1000!的结果
                long  sum = 1;
                for (long i = 1; i <=1000; i++) {//再大就超标了
                        sum = sum*i;
                }
                System.out.println(sum);
                //将long整数转换为字符串
                String str =String.valueOf(sum);
                //将这个字符串转换为一个字符数组
                char[]  ch=str.toCharArray();
                //定义一个计数的变量
                int count= 0;
                System.out.println(ch.length);
                //把字符数组里面的每一个元素遍历出来
                System.out.println(ch[3]);
                for (int i = 0; i < ch.length; i++) {
                        if(ch[i]=='0'){//记得写'0'
                                System.out.println(i);
                                count++;
                        }else{
                                continue;
                        }
        }
                System.out.println(count);
        }
}
因为1000!太大了数字不能打印出来导致后面的全错误了,希望你们给我个另外的方法做出这道题

15 个回复

倒序浏览
楼主,弱弱的提醒你一下,你只需要查一下末位是0的数有多少个就好了、比如1000,你从个位数起,有三个,如果是50,从各位数起,有一个0,那么我如果是1000*50,就可以直接用3+1个0来计算了。当然了,这个只是计算从各位数起有多少个0.至于中间,我还没想到好办法。
回复 使用道具 举报
本帖最后由 pk49800 于 2014-6-11 20:30 编辑
  1. import java.math.BigInteger;


  2. /**
  3. * @author Administrator
  4. * 计算一个数的阶乘末尾有几个连续的0
  5. * n! = n*(n-1)!=n*(n-1)*(n-2)!...=n*(n-1)(n-2)*..2;
  6. */
  7. public class ComputeSuffixZero {
  8.         public static void main(String[] args){
  9.                 //统计一个数的阶乘末尾总共包含几个0
  10.                 int n = 1000;//被测试的数
  11.                 int count = 0;//末尾0的个数
  12.                 BigInteger k = BigInteger.valueOf(0);//n-i
  13.                 BigInteger sum = BigInteger.valueOf(1);
  14.                 //BigInteger bi = null;
  15.                 for(int i = 0;i<n;i++){
  16.                         k = BigInteger.valueOf(n-i);
  17.                         //System.out.println("k = "+k);
  18.                         sum = sum.multiply(k);
  19.                         //bi = BigInteger.valueOf(sum);
  20.                         if(k.mod(BigInteger.valueOf(5)) == BigInteger.valueOf(0))
  21.                                 count++;
  22.                 }
  23.                
  24.                 //统计一个数的阶乘总共包含几个0
  25.                 String s = sum.toString();
  26.                 int zero_count = 0;
  27.                 char[] b = s.toCharArray();
  28.                  for(int j = 0;j < s.length(); j++){
  29.                          if(b[j]=='0')
  30.                                  zero_count++;                         
  31.                  }
  32.                 System.out.println(n+"的阶乘为"+s);
  33.                 System.out.println(n+"的阶乘末尾包含:"+count+"个0");
  34.                 System.out.println(n+"的阶乘包含:"+zero_count+"个0");
  35.                
  36.         }

  37. }
复制代码
这次好了,只要你计算机内存够大,就能显示出来了:lol

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报
就看看 学习下
回复 使用道具 举报

先谢了  我慢慢读一下:victory:
回复 使用道具 举报
要是非要用1000!的话   ,我有一个想法,截取的方法,创建一个数组,开始阶乘循环,每当数字位数超过N位时,截取除去靠后的N位的数字,成为一个新元素(比如说123456789123456,我可以截取成123456和789123456)这就成了两个元素,在下一次循环的时候,两个数分别乘 i ;再把后面这个数超出N位的部分截出来加到前面这个数与 i 的乘积里面去,一只循环到 i =1001结束,我们再计算这个数组里面有多少0,就能得出结果了,不管你的数字多大都可以搞定了。

本人还在学习毕老师的课程,第一遍才看到第9天,所以这里只是提供一个想法给予参考。
回复 使用道具 举报
24岁??? 发表于 2014-6-11 19:38
要是非要用1000!的话   ,我有一个想法,截取的方法,创建一个数组,开始阶乘循环,每当数字位数超过N位时 ...

谢了,共同学习,我也在学基础:handshake
回复 使用道具 举报
人心如水 发表于 2014-6-11 19:41
谢了,共同学习,我也在学基础

:handshake
回复 使用道具 举报
本帖最后由 曲佳奇 于 2014-6-11 20:36 编辑

用数组可做.
回复 使用道具 举报
本帖最后由 曲佳奇 于 2014-6-11 21:25 编辑
  1. import java.util.Scanner;

  2. public class Test2 {
  3.         public static void main(String[] args) {
  4.                 int add;
  5.                 int len,temp,i,j,count=0;;
  6.                 int[] a= new int[10000];
  7.                 Scanner sc = new Scanner(System.in);
  8.                 int n=sc.nextInt();
  9.                 a[0]=1;
  10.                 len=1;
  11.                 for(i=2;i<=n;i++){
  12.                         for(j=1,add=0;j<=len;j++){
  13.                                 temp=a[j-1]*i+add;
  14.                                 a[j-1]=temp%10;
  15.                                 add=temp/10;
  16.                         }
  17.                         while(add!=0){
  18.                                 len++;
  19.                                 a[len-1]=add%10;
  20.                                 add/=10;
  21.                         }
  22.                 }
  23.                 System.out.print(n+"的阶乘为:");
  24.                 for(int k=len;k>=1;k--){
  25.                         if(a[k-1]==0)
  26.                                 count++;
  27.                         System.out.print(a[k-1]);
  28.                 }
  29.                 System.out.println();
  30.                 System.out.println("零的个数为:"+count);
  31.         }
  32. }
复制代码

用数组模拟阶乘

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报 1 0
可以放弃基本类型,用string类型代替数字,底层拆解string做进位运算
回复 使用道具 举报
本帖最后由 曲佳奇 于 2014-6-11 22:01 编辑

BigInteger 也可以完成
  1. import java.math.BigInteger;
  2. import java.util.Scanner;

  3. public class Test2 {
  4.         public static void main(String[] args) {
  5.                 Scanner sc = new Scanner(System.in);
  6.                 int count=0;
  7.                 int n = sc.nextInt();
  8.                 System.out.println(digui(BigInteger.valueOf(n)));
  9.                 String str = digui(BigInteger.valueOf(n)).toString();
  10.                 for(int i =0;i<str.length();i++){
  11.                         if('0'==str.charAt(i)){
  12.                                 count++;
  13.                         }
  14.                 }
  15.                 System.out.println("零的个数为:"+count);
  16.                
  17.         }

  18.         static BigInteger digui(BigInteger s) {
  19.                 if (s.equals(BigInteger.valueOf(1))) {
  20.                         return BigInteger.valueOf(1);
  21.                 } else {
  22.                         return s.multiply(digui(s.subtract(BigInteger.valueOf(1))));
  23.                 }
  24.         }
  25. }
复制代码



回复 使用道具 举报
肯定啦,上千位数,除非用科学计数法
回复 使用道具 举报

{:2_42:}牛
回复 使用道具 举报
1000的阶乘太大了装不下
回复 使用道具 举报
用BigInteger!很好解决啊!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马