新手入门简单算法

来源:互联网 发布:娇韵诗淘宝官网旗舰店 编辑:程序博客网 时间:2024/06/05 10:19

问题描述:一本书的页码从自然数1开始顺序编码直到自然数n。书的页码 按照通常的习惯编排,一个页码内都不包含多余的前导数字0.例如,第6页用数字6表示,而不是06或006等;数字计数问题要求给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,…,9.。

//Java程序如下:import java.util.Scanner;public class T1_1 {    public static void main(String[] args) {        int array[] = new int [10];        Scanner in = new Scanner(System.in);        System.out.print("请输入书的页码: ");        int n = in.nextInt();        for (int i = 1; i <= n; i++) {            int m = i;            while(m>0){                array[m%10]++;                m /= 10;            }        }        for (int i = 0; i < array.length; i++) {            System.out.println("出现"+i+"的次数:"+array[i]);        }    }}

经过测试当输入书的页码数为12345678或者更大时,要得出结果的时间就要大大增加。这种方法是不可行的,提高效率方法如下:

分析:
假设输入的页码数为: 234
可以把它看
0 0 0
0 0 1
0 0 2

0 1 0

0 9 9

1 0 0

2 3 4
这样就可以看出当书的页码到99时,0~9的数值在个位各出现10(100/10)次,
在十位也各出现10(100/10)次, 在百位0(0**(*=0~9))出现 100次

当页码数到199时,0~9的数值在个位各出现20(200/10)次,
在十位也各出现20(200/10)次,在百位0和1(0**和1**(*=0~9))出现100次

当页码数到234时,0~9的数值在个位各出现23(230/10)次,
但0~4(230 231 232 233 234)额外出现1次,
在十位各出现20(200/10)次,但0和2额外出现10(20* 21* 22* (*=0~9))次,
3额外出现5(23*(*=0~4))次
在百位0和1(0**和1**(*=0~9))出现100次
但2出现35(2**(**=00~34))次
由此可见这是一种递归的方法,比原先穷举的方法效率要高太多了。
这里写图片描述
因为题目要求 一个页码内都不包含多余的前导数字0.例如,第6页用数字6表示,而不是06或006等
所以0出现的次数要减去 23+1+20+10+100-1*10^0-10^1-10^2 = 43;

//Java程序如下import java.util.Scanner;public class T1 {    public static void main(String[] args) {        int array[] = new int[10];        Scanner in = new Scanner(System.in);        System.out.print("请输入书的页码: ");        int n = in.nextInt();        int num =n;        int x,y;        int length=(int) Math.log10(n)+1;        while(length>0){            y=(int) Math.log10(num);             x=(int) (num/Math.pow(10, y));            for (int i = 0; i < array.length; i++) {                array[i] += (int)(x*y*Math.pow(10, y-1));            }            for (int i = 0; i < x; i++) {                array[i] += (int)Math.pow(10, y);            }            num = num - x*(int)Math.pow(10, y);            array[x] += num+1;            length--;        }        for (int i = 0; i < (int)Math.log10(n)+1; i++) {            array[0] -= (int)Math.pow(10, i);        }        for (int i = 0; i < array.length; i++) {            System.out.println("出现"+i+"的次数:"+array[i]);        }    }}