`
yiminghe
  • 浏览: 1460575 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一道数字统计的题

阅读更多

 不知道是不是 没事闲的,想出来一道题:


0 到 n 的数字中,有几个数字,包含某个个位数,如


0到11有    2个数包含 1 ------- 1, 11

               1个数包含 4 ------- 4

               2 个数包含 0 ------- 0,10


结果停不下来了,花了一晚上搞了个程序,我脑袋笨还是咋的,可累死了,不知道程序高不高效,总比一个个个数好,但 0统计没能整合在一起,怎么做啊,其他倒都可以了

 

public class NumberCount {

    public static void easy(int s, int n, int d) {

        System.out.println("-----------------------");
        int count = 0;
        for (int i = s; i <= n; i++) {
            if ((i + "").indexOf(d + "") != -1) {
                count++;
                //System.out.println(i);
            }
        }

        System.out.println(count);

        System.out.println("-----------------------");
    }

    public static void main2(String[] args) {
        Time t = new Time();
        t.start();
        System.out.println(coutD(98798, 0));
        System.out.println("duration :" + t.stop());
        t.start();
        easy(0, 98798, 0);
        System.out.println("duration :" + t.stop());
    }


    //0-n 有几个数字 包含 0
    public static int coutD(int n, int d) {


        String nstr = n + "";
        int l = nstr.length();
        if (d == 0) {
            throw new RuntimeException("error :d !=0 ");
        }
        int[] ar = generateN(l, d);
        int result = 0;

        for (int i = 0; i < l; i++) {
            String c = nstr.charAt(i) + "";

            int cnum = Integer.parseInt(c);
            if (cnum < d) {
            } else if (cnum == d) {
                result += ar[l - i];
                //直接把后面的算出来
                if (i != l - 1)
                    result += Integer.parseInt(nstr.substring(i + 1));
                break;
            } else {
                result += ar[l - i] + (cnum - d - 1) * ((ar[l - i] - 1) / d) + Math.pow(10, l - i - 1) - 1;
            }


        }

        return result;
    }


    //d  内 有几个 数 包含 d
    //d0    内 有几个 数 包含 d
    //d00   内 有几个 数 包含 d
    //d000     内 有几个 数 包含 d
    public static int[] generateN(int n, int d) {
        int[] narray = new int[n + 1];
        narray[1] = 1;

        for (int i = 2; i <= n; i++) {


            //ex:
            //1000  {0-100 101-199 200-999 1000}
            //2000  {0-200 201-299 300-999 1000}
            //   (narray[i - 1] + (int) Math.pow(10, i - 2) - 1 + (9 - d) * ((narray[i - 1] - 1) / d));
            //(narray[i - 1] - 1) / d)   每100 个 含的个数
            narray[i] = (narray[i - 1] + (int) Math.pow(10, i - 2) - 1 + (9 - d) * ((narray[i - 1] - 1) / d)) * d + 1;
            // System.out.println("narray[" + i + "]=" + narray[i]);
        }

        return narray;
    }


    //1 内 有几个 数 包含 d
    //10  内 有几个 数 包含 d
    //100  内 有几个 数 包含 d

    public static int[] generateN2(int n, int d) {


        int[] narray = new int[n + 2];
        narray[1] = d > 1 ? 0 : 1;

        narray[2] = d <= 1 ? 2 : 1;
        int base = 0;
        for (int i = 3; i <= n; i++) {
            base = narray[i - 1];

            //100,100,0-100 101-200 不一样
            if (d <= 1)
                base--;

            //0 特殊

            //假设 10000
            if (d != 0)
                //d=6
                //0-1000 6001-6999 区别考虑  ,6001-6999 都带 6,下面 乘的是 9    ,下面就不考虑  6001-6999
                narray[i] = (int) Math.pow(10, i - 2) - 1;
            else
                //0-1000 6001-7000 区别
                //00XX,10XX,20XX,....90XX 特殊于 0-1000  10 个  Math.pow(10, i - 3)
                //   但 0000,1000,2000,考虑过了、,减10

                //写出来 我都有点不懂 。。。。


                // narray[i] = ((int) Math.pow(10, i - 3) - 1)*10;
                narray[i] = (int) Math.pow(10, i - 2) - 10;
            narray[i] += 9 * base + 1;

            //0,1 边界特殊 100,1000,。。。
            if (d <= 1) narray[i]++;

        }

        return narray;
    }

    //0-n 有几个数字 包含 0
    public static int coutD2(int n, int d) {

        int base = 0;
        String nstr = n + "";
        int l = nstr.length();

        if (l == 1) {
            if (n >= d)
                return 1;
            return 0;
        }
        int[] ar = generateN2(l, d);
        int result = 0;

        for (int i = 0; i < l; i++) {
            String c = nstr.charAt(i) + "";

            int cnum = Integer.parseInt(c);
            if (cnum < d) {

                result += ar[l - i] * cnum;
            } else if (cnum == d) {

                result += d * ar[l - i];
                //直接把后面的算出来
                if (i != l - 1)
                    result += Integer.parseInt(nstr.substring(i + 1));
                //0,1 特殊
                if (d > 1)
                    result += 1;
                break;
            } else {
                base = ar[l - i];
                //0,1特殊
                if (d <= 1)
                    base--;
                result += (cnum - 1) * base;
                //0 特殊
                if (d != 0)
                    result += Math.pow(10, l - i - 1);
                else
                    result +=  ar[l - i] ;

            }


        }

        return result;
    }

    public static void main(String[] args) {


        /*int[] a1 = generateN(9, 1);
        System.out.println(Arrays.toString(a1));*/


       /*  int[] a2 = generateN2(9, 0);


        System.out.println(Arrays.toString(a2));*/
        Time t = new Time();
        t.start();
        System.out.println(coutD2(45645, 2));
        System.out.println("duration :" + t.stop());
        t.start();
        easy(0, 45645, 2);

        System.out.println("duration :" + t.stop());
    }

}
 

 

 

分享到:
评论

相关推荐

    Java由浅入深解决一道数字组合题的方案.pdf

    本文将通过Java语言解决一道数字组合题,题目要求使用9个数字(1-9)组成3个数字,第二组数字是第一组数字的两倍,第三组数字是第一组数字的3倍,且每个数字只能使用一次。 首先,根据题目要求进行要点分析: 1. 9...

    概率论与数理统计试题及答案21参考.doc

    第六题是一道条件概率问题,需要计算单个种子发芽的概率,以及它来自高发芽率盒的概率。 第七题是一个决策问题,涉及期望收益计算,利用每次射击成功的概率计算总收益的期望值。 第八题是质量控制问题,使用二项...

    概率统计试题图表信息的数据处理探析.pdf

    例如,2016年新课标文科卷的一道试题,通过二维表格展示了续保人的出险情况和保费之间的关系,要求学生根据数据计算概率和平均保费,考察了数据分析和运算素养。 频数分布图、频率分布表和频率分布直方图则用于展现...

    微软的一道算法优化题

    根据给定的信息,本文将对一道来自微软的算法优化题目进行深入分析,主要涉及如何高效地计算出在从1到N的所有整数中数字“1”出现的总次数。 ### 题目背景 给定一个十进制正整数N,任务是从1开始到N的所有整数中...

    oj题.zip

    9. **192.py** - 可能对应LeetCode的192题,"Word Frequency"(词频统计),需要使用哈希表或字典来统计字符串中每个单词的出现次数。 10. **202.py** - 最后是202题,"Happy Number"(快乐数),这是一个简单的...

    明水事业编招聘2020年考试真题及答案解析下载版.docx

    4. 一道数字序列推理题,可能涉及到数学的逻辑推理能力。 5. 一道社会保障制度的单选题,关注社会政策和福利体系。 6. 一段关于情感和社会性的论述,可能出现在语文或社科类试题中。 7. 一道关于群体风险与概率的...

    江苏省徐州市丰县 八年级数学下学期期中试题(扫描版) 苏科版 试题.doc

    - 题目21:可能是一道统计题,计算某种事件发生的概率,或者根据比例计算总体数量。 - 题目22:涉及到全等三角形的证明,以及面积关系的应用。 - 题目23:通过解方程组确定未知数A、B和C的值,并进行加法运算。 ...

    广东省肇庆高三语文上学期第一次统计检测试题(扫描版,无答案) 试题.doc

    这份试题为扫描版,可能意味着它是一个非电子格式的原始纸质试卷的数字化版本,且不包含答案,因此学生或教师在使用时需要自行批改或寻求解答。 在中学阶段,语文作为基础学科,其试题通常会包括以下几个方面: 1....

    湖南省娄底市冷水江市七年级数学下学期期末试题(扫描版) 新人教版 试题.doc

    第23题是一道统计题,计算应聘者的平均分数和加权平均分,用于模拟实际生活中的招聘场景。第24题可能是关于利润和成本的计算,学生需要根据购入商品的数量和价格,以及销售价格,计算总利润。 综合题中,第25题...

    蔡子华2010考研数学必做客观题1500题精析全(含答案)

    每一道题目都经过了深度解析,不仅给出了标准答案,还详细讲解了解题思路和方法,这对于考生理解和掌握各种题型至关重要。 高等数学是考研数学的基础,涉及微积分、极限理论、一元函数微分学、一元函数积分学、多元...

    2014届高三数学总复习 课时提升作业(五十七) 第九章 第四节 统计图表、数据的数字特征、用样本估计总体 文

    统计学在高三数学总复习中占据重要地位,尤其在第九章第四节,主要涉及三个核心概念:统计图表、数据的数字特征以及用样本估计总体。这些知识点是数据分析的基础,对于理解数据分布、提取信息和做出预测至关重要。 ...

    内蒙古赤峰市2013年中考数学真题试题

    - 第5题是一道简单的算术题,计算从一楼到五楼需要经过的台阶总数。 2. **换算题**: - 第16题涉及到单位转换,血压单位千帕(kpa)和毫米汞柱(mmHg)之间的换算,要求考生理解并运用换算公式。 3. **统计与概率**...

    数字信号处理——时域离散随机信号处理 课后答案

    每一道习题都是一个微型的工程实践,通过反复练习,可以提高对离散随机信号处理技术的掌握程度,为后续的学习和实际工作打下坚实基础。对于想在通信、图像处理、音频处理等领域发展的专业人士来说,这是一份非常有...

    交换技术复习题及答案

    以上解析涵盖了交换技术复习题中的单项选择题部分,针对每一道题目进行了详细的分析和解释。接下来的部分包括多项选择题、名词解释、判断改错以及简答题等内容,同样包含了丰富的知识点和技术细节,有助于全面理解和...

    吉林省白山市高一数学上学期期末考试试题(扫描版) 试题.doc

    例如,第13题、14题、15题和16题可能要求学生填写数字、表达式或者解决某个数学问题的结果。其中,第16题的答案是②③,可能是一道关于集合或者逻辑关系的问题。 解答题部分是试卷的重点,共6小题,合计70分,每题...

    南开上机题100道编程题 十年内每次考试全部命中

    4. 函数定义与调用:题目中的每一道题都是一个独立的函数,如`fun`,它们接收参数,执行特定任务,并可能返回结果。函数调用是程序设计中组织代码的重要方式,可以使代码结构清晰,便于复用和测试。 5. 指针与引用...

    全国青少年软件编程等级考试C语言一级真题(不含答案)2021年3月--2022年6月

    考生需要实现对数字的遍历检查,统计数字中特定数字出现的次数,并结合整除判断。 9. 字符三角形 此题涉及到多层循环的使用,创建特定形状的字符图案。 10. 计算(a+b)*(c-b)的值 这是一道涉及多项式运算的题目...

    吉林省长春市南关区2018届九年级数学质量调研(二模)试题(扫描版).pdf

    - 第16题可能是一道概率问题,要求学生计算两个数字之和为偶数的概率。 - 第17题可能涉及到线性方程组的解法,让学生解决实际应用问题。 - 第18题可能是一道几何证明题,要求证明两个角相等。 - 第19题可能是...

    洛阳市八年级下学期数学期末试题及答案精选.doc

    例如,第9题可能涉及数字运算,第11题可能是代数表达式的简化,第12题可能考察角度的计算,第13题可能需要根据角度分配找出未知角度,第14题可能涉及到函数的定义,第15题则可能涉及坐标平面内的点的坐标表示。...

    初一数学下学期期末考试题答案.docx

    1. 第四题可能是一道数据分析题,需要分析吞吐量随时间的变化趋势,并进行计算。 2. 第五题可能是关于收入统计的,需要学生理解数据图表,计算最高和最低收入,以及年增长率。 **几何证明题部分:** 六题和七题涉及...

Global site tag (gtag.js) - Google Analytics