`
yiminghe
  • 浏览: 1434206 次
  • 性别: 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());
    }

}
 

 

 

分享到:
评论

相关推荐

    基于MATLAB的不变矩答题卡识别 可识别学号,学科,答案,并进行分数统计,以及判断是否及格+源代码+文档说明+文案

    本课题为基于MATLAB的不变矩答题卡识别。可识别学号,学科,答案,并进行分数统计,以及判断是否及格。...循环结束后就可以统计出考生选对的答案,然后将统计好的数字乘上每道题的分数就可以计算出考生单选题的得分。

    c语言统计.v 文件中的cell数

    偶然间在网上发现ASIC FPGA 数字工程司的一道面试题。按自己的理解做了下。 在centos 下测试了一下应该没问题。内部注释有相关说明

    基于MATLAB的不变矩答题卡识别.毕业设计

    题介绍:本课题为基于 MATLAB 的不变矩答题卡识别。可识别学号,学科,答案,并进行分数统计...循环结束后就可以统计出考生选对的答案,然后将统计好的数字乘上每道题的分数就可以计算出考生单选题的得分。 算法流程图

    Python3 统计字符的个数

    学python编程时,遇到这样一道题: 计算字符个数(10分) 题目内容: 接受一个由字母和数字组成的字符串,和一个字符,然后输出输入的字符串中含有该字符的个数。不区分大小写。 可以使用以下语句实现字符串s的输入...

    MATLAB hough变换答题卡识别(GUI,配LW).zip

    matlab图像处理 本课题为基于MATLAB的不变矩答题卡识别。可识别学号,学科,答案,并进行分数统计,以及...循环结束后就可以统计出考生选对的答案,然后将统计好的数字乘上每道题的分数就可以计算出考生单选题的得分。

    MATLAB的不变矩答题卡识别.zip

    本课题为基于MATLAB的不变矩答题卡识别。可识别学号,学科,答案,并进行分数统计,以及判断是否及格。...循环结束后就可以统计出考生选对的答案,然后将统计好的数字乘上每道题的分数就可以计算出考生单选题的得分。

    seu吴健雄学院大二大三部分试卷.zip

    包含通信网,数字通信,统计信号,通原,计组,通电,DSP,专集,信安,微机,数物,数值,信号,模电,数模,电磁场。其中,通原试卷年份较早,最终卷子差异比较大,建议把平时布置的习题好好弄懂。另外,信安建议...

    上海电机学院C语言实训答案

    ”,不给机会重做,10道题做完后,按每题10分统计总得分,然后打印出总分和做错的题数。 (18)学生成绩统计 从键盘输入一个班(全班最多不超过30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别实现...

    50用户在线考试系统

    因为阅读理解是以大题为单位选题或是抽题,而每个大题都有不确定个小题,所以大题的总分值无法统计,只能输入小题的“分值”。注意:一旦修改试卷的“题量”和“分值”,将会清空已经考过此试卷的考生数据。 课程...

    C语言经典例题100道

    17.统计英文字母/空格/数字个数 18.求s=a+aa+aaa+aa...a的值 19.求解"完数" 20.球体自由落下物理问题 21.猴子吃桃问题 22.乒乓球比赛抽签问题 23.打印菱形图案 24.分数数列求和 25.求1+2!+3!+...+20!的和 26.利用...

    2014华为编程大赛第二轮(2场)

    外星人使用的并非10进制/16进制等,有些星球居然使用N进制(据统计N都在2~35之间),现在我们将首先给您一个数字表示N进制,然后给出两个数字的字符串,请算出其求和结果并输出,如果输入不能正常计算则输出-1。...

    世界500强面试题.pdf

    1.4.10. 统计整数二进制表示中 1 的个数........................................................102 1.5. 面试题集合(四) ....................................................................................

    大数据:数据清洗、数据分析、数据挖掘.doc

    基本概念 数据清洗从名字上也看的出就是把"脏"的"洗掉",指发现并纠正数据文件中可识别 的错误的最后一道程序,包括检查数据一致性,处理无效值和缺失值等。因为数据仓库 中的数据是面向某一主题的数据的集合,这些...

    python入门到高级全栈工程师培训 第3期 附课件代码

    python入门到高级全栈工程师培训视频学习资料;本资料仅用于学习,请查看...11 强插一道面试题 12 Model连表操作梳理 13 多对多自关联 14 Model操作补充 15 再插两道JavaScript面试题 16 Model操作之select_related以及...

    C/C++面试题目及解答.doc

    (朗讯的一道笔试题) 答案:可以,可以用_onexit 注册一个函数,它会在main 之后执行; 如果你需要加入一段在main退出后执行的代码,可以使用atexit()函数,注册一个函数。 语法: #include ...

Global site tag (gtag.js) - Google Analytics