`
yiminghe
  • 浏览: 1466547 次
  • 性别: 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的所有整数中...

    PTA 统计一个整数的位数

    "统计一个整数的位数"是PTA中的一道典型问题,涉及到的基础知识点主要是整数的表示和计算。在解决这类问题时,我们需要理解计算机如何存储整数,以及如何通过编程语言来处理这些数字。 首先,计算机中的整数是以二...

    计算机C语言编程题库(100题)

    第4题是一道字符串处理的典型题目,它要求统计一个字符串中每个字母出现的次数,并将结果存储在数组中。这个问题考验了解题者对字符串操作的熟练度,同时要求对字符进行判断和计数。 第5题则是一个较为复杂的题目,...

    oj题.zip

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

    普及组近5年NOIP试题分析_叶国平.ppt

    第一题是数字统计,涉及到数字中特定数字出现次数的计算。考生需要编写程序,统计指定范围内整数中数字2出现的次数。解决这一问题的关键在于掌握分离数字的技巧,并对每个数进行统计。算法较为简单,时间复杂度为O(R...

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

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

    六年级数学上册 四 统计与可能性 能性大小》习题精选(无答案) 浙教版 试题.doc

    在另一道题中,我们可能会遇到一个转动指针的游戏,指针会在标有不同分数的区域间停留。学生需要预测指针停在特定区域的次数。这类问题不仅锻炼了学生的计算能力,还训练了他们如何根据已知信息进行合理预测。 当...

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

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

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

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

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

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

    交换技术复习题及答案

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

    吉林省白山市高一数学上学期期末考试试题(扫描版) 试题.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题可能是...

    给定N个正整数,请统计奇数和偶数各有多少个-C语言代码

    这是一道基础的编程练习,旨在帮助学习者掌握C语言的基本语法、循环结构以及条件判断。下面我们将详细讲解实现这个功能所需的C语言知识。 首先,我们要了解C语言的基础结构。一个C程序通常由预处理指令、函数定义和...

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

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

Global site tag (gtag.js) - Google Analytics