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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© @翱翔@ 高级黑马   /  2014-1-14 14:47  /  1901 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

求1000!的结果中包含多少个0 1000! = 1×2×3×4×5×...×999×1000

点评

测试题要独立完成,发帖提问会扣分的  发表于 2014-1-15 22:09

13 个回复

倒序浏览
本帖最后由 几番意难相付 于 2014-1-14 15:11 编辑

先算出1000!的结果 然后转成字符串 用indexOf("0")试试?
回复 使用道具 举报
我想的代码是这样的,你看看:
  1. public class Test9 {

  2.        
  3.         public static void main(String[] args) {
  4.                 // TODO Auto-generated method stub
  5.                 //定义一个变量用于计数
  6.                 int count=0;
  7.                 //每出现一个2和5,就会在末尾有一个0,所以只要看,从1到1000中总共有多少个2和5就可以了,
  8.                 //又因为5总比2少,所以,只要看1000的阶乘中有多少个约数5就可以了。
  9.                 for(int x=1;x<5;x++){
  10.                         count=(int) (count + 1000/Math.pow(5, x));
  11.                 }
  12.                 System.out.println(count);

  13.         }

  14. }
复制代码
回复 使用道具 举报
汪伟楠 发表于 2014-1-14 15:25
我想的代码是这样的,你看看:

还有0呢  10  100  1000  这几个0别忘了哈
回复 使用道具 举报
本帖最后由 xu6148152 于 2014-1-14 16:16 编辑
  1. class Test
  2. {
  3. public static void main(String[] args)
  4. {
  5. int x = 1000;
  6. int count=0;
  7. while (x>0)
  8. {
  9.       count = count + x / 5;
  10.       x = x / 5;
  11. }
  12. System.out.println(count);
  13. }
复制代码
0是由因数10产生的,10是由2*5产生的。

每2个数就有一个是2,每5个才有1个是5的倍数。所以我们只需要讨论有多少个因数5就可以了。

每5个数有1个5的因数,那么1000/5=200个
每25个数有1个5*5的因数,那么就多出来1000/25=40个5
每125个数就有5*5*的因数,那么多出来的5增加1000/125=8个
5^4有一个,则再增加一个5

总共有5的因数1000/5+1000/25+1000/125+1
=249个5

那么1000的阶乘后面有249个0
回复 使用道具 举报
几番意难相付 发表于 2014-1-14 15:07
先算出1000!的结果 然后转成字符串 用indexOf("0")试试?

结果返回什么类型?
回复 使用道具 举报
几番意难相付 发表于 2014-1-14 15:07
先算出1000!的结果 然后转成字符串 用indexOf("0")试试?

你没听过国王和象棋的故事? 别说1000! 就是100!甚至50!或者30! java都保存不了吧
回复 使用道具 举报
1000!这个太大了吧!
回复 使用道具 举报
贴一段代码
  1. import java.math.BigDecimal;

  2. public class Test {
  3. public static void main(String[] args) {
  4. String strTemp = String.valueOf(Test.getFactorial(new BigDecimal(1000)));
  5. char[] result = strTemp.toCharArray();

  6. for (int i=0; i<result.length; i++) {
  7. System.out.print(result[i]);
  8. if ((i+1)%10 == 0)
  9. System.out.println();
  10. }
  11. }

  12. public static BigDecimal getFactorial (BigDecimal num) {
  13. BigDecimal temp = new BigDecimal(0);
  14. if (num.longValue() == 0) {
  15. return num;
  16. } else if (num.longValue() < 0) {
  17. System.out.println("请输入大于0的数");
  18. return new BigDecimal(-1);
  19. } else if (num.longValue() == 1) {
  20. return num;
  21. } else {
  22. return num.multiply(getFactorial(temp.add(num.subtract(new BigDecimal(1)))));
  23. }
  24. }
  25. }

复制代码
回复 使用道具 举报
0的来源有两种:
第一种:本来就有的如:10、20、30……100(10~100共11个)、110、120……200(11个)……*******910、920……990、1000(特殊的12个)
第二种:2和5相乘而来。这种情况再分三种:
A、个位是2  5 ,每十个数有一个0。如2X5, 12X15,22X25等后面一定有0. 计算每两个数相乘后,结果中0的个数,将其累加起来。   
B、十位上是2和5的,如20X50,120x150等,2和5乘会多出来0
C、百位上是2和5的。只有一个,即200x500,只会多出来1个0.

用累加的方法
回复 使用道具 举报
这是我自己写的,之前帮别人解答的
  1. import java.math.*;

  2. /*
  3. 1000! 的运算结果早已超出基本数据类型的长度,所以在接受运算结果是不能使用基本数据类型。
  4. */

  5. class JieChengDemo
  6. {
  7.         //求指定数值的阶乘
  8.         public BigInteger qiuJieCheng(int num)
  9.         {
  10.                 BigInteger biginteger = new BigInteger("1");
  11.                 for(int x = 1; x <= num; x++)
  12.                 {
  13.                         biginteger = biginteger.multiply(new BigInteger(x+""));
  14.                 }
  15.                 System.out.println(num+"!的运算结果:"+"\r\n"+biginteger);
  16.                 return biginteger;
  17.         }
  18.         

  19.         public static void main(String[] args)
  20.         {
  21.                 //求阶乘结果中”0“的个数
  22.                 JieChengDemo jcd = new JieChengDemo();
  23.                 char[] numChar = jcd.qiuJieCheng(1000).toString().toCharArray();
  24.                 int count = 0;
  25.                 for(int x = 0; x < numChar.length; x++)
  26.                 {
  27.                         if('0' == numChar[x])
  28.                         {
  29.                                 count += 1;
  30.                         }
  31.                 }
  32.                 System.out.println("结果中包含\"0\"的个数为: "+count);
  33.         }
  34. }
复制代码
回复 使用道具 举报
402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

自己做一个计算器吧。看上去也不是很多位。
回复 使用道具 举报
汪洋大海 发表于 2014-1-15 13:24
4023872600770937735437024339230039857193748642107146325437999104299385123986290205920442084869694048 ...

6*9*2
7*8*2
5*2
就这三种组合可能产生0
把数字因式分解,再进行组合。应该可以计算出结果。
这个题有点难度。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马