黑马程序员技术交流社区

标题: 1x1000问题 [打印本页]

作者: 小十    时间: 2015-3-14 21:53
标题: 1x1000问题
1x2x3....1000。途中一共有几个0?用代码怎么实现的?是不是&10方法。用正则表达式是不是也可以实现?
作者: 白春秋    时间: 2015-3-14 22:14
本帖最后由 白春秋 于 2015-3-14 22:18 编辑

遍历1到1000,首先筛选出能除以10的数,记录总个数,否则遍历除以5的个数,关键就是除以10的说句有可能多个0的情况,之前也遇到过这个问题自己写的代码如下/**
*
*/
package com.itheima;

/**
* 9、 求1000!的结果中包含多少个0?注:1000! = 1×2×3×4×5×...×999×1000
*
* 思路: 要知道1000! 第一步 中有多少个0只需要判断1到1000的所有数据末尾0的数量和尾数为5的数的数量即可 2,for循环遍历1到1000
* 3,把遍历到的数据转成字符串 4,判断末尾0的个数和末尾是5的个数
*/
public class Text9 {
          public static void main(String[] args) {
               func1(1000);
        }
// 定义一个静态方法:完成计算统计x!末尾0的个数
        public static void func1(long l) {

                // 定义变量分别记录末尾是0末尾是5和结果末尾0的个数
                int sum_0 = 0;
                int sum_5 = 0;
                int sum = 0;

                for (int i = 1; i <= l; i++) {

                        // 将基本数据类型转成String
                        String str = String.valueOf(i);

                        // 先判断能被5整除的数,即末尾是0或者5
                        if (i % 5 == 0) {
                                // 再判断不能被10整除,即选择末尾是5,末尾是5的数乘以偶数就可使积的末尾增加一个0,而连续数据末尾是5的个数比偶数的个数要少,因此有一个末尾是5的数据,最终积就增加一个0
                                if (i % 10 != 0) {

                                        sum_5 = sum_5 + 1;
                                } else {
                                        // 末尾0的个数:以最后一个0所在的索引为endindex截取子串,每截取一次sum_0加1
                                        for (int j = 0; str.lastIndexOf("0") == (str.length() - 1); j++) {

                                                str = str.substring(0, str.lastIndexOf("0"));
                                                sum_0 = sum_0 + 1;
                                        }

                                }

                        }
                }

                sum = sum_0 + sum_5;
                System.out.println(sum_0);
                System.out.println(sum_5);
                System.out.println(l + "!中有" + sum + "个0");
        }

}



作者: cat73    时间: 2015-3-14 23:36
本帖最后由 cat73 于 2015-3-14 23:37 编辑

Python代码
  1. def calc(x):
  2.         result = x
  3.         
  4.         while(x > 1):
  5.                 x = x - 1
  6.                 result = result * x

  7.         return result

  8. print(calc(1000))
复制代码

输出:
  1. 402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
复制代码




作者: cat73    时间: 2015-3-15 10:22
师傅在面对徒弟的提问时,如果直接给出答案,那只能是害了徒弟,何况我还不是你师傅,只是个路人。
而且我只是看到你在说阶乘的事,就做了个求结果的东西而已。

作者: fantacyleo    时间: 2015-3-15 10:35
两种选择:
1. BigDecimal类直接求出结果,然后统计0的个数
2. 利用小学数学的计算模式逐步求解。参见 http://bbs.itheima.com/thread-133474-1-1.html
作者: jeasonlzy    时间: 2015-3-15 13:55
用数组实现吧。。




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