新手入门简单算法
来源:互联网 发布:娇韵诗淘宝官网旗舰店 编辑:程序博客网 时间: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]); } }}
- 新手入门简单算法
- Github新手入门,简单使用方法!
- Github新手入门,简单使用方法!
- 一个简单的hook 新手入门
- protege 新手入门 建立简单本体
- A*寻径算法新手入门
- A*寻径算法新手入门
- A*寻径算法新手入门
- 新手入门
- 新手入门
- 新手入门
- 新手入门
- 新手入门
- 新手入门
- WinForm调用WebService简单实例详解【新手入门】
- 【适合新手入门】批处理简单的输入判断
- WinForm调用WebService简单实例详解【新手入门】
- Unity3D之NGUI简单计算器新手入门
- MT6356 PMIC Datasheet
- Spring的@Scheduler注解实现定时任务
- 要开始振作起来
- Mysql命令大全
- bzoj2720 [Violet 5]列队春游 (期望概率)
- 新手入门简单算法
- Fedora 及kali Gnome 安装
- textrank算法原理与提取关键词、自动提取摘要PYTHON
- 图片拷贝
- 虚拟化技术之KVM安装与使用
- PHP 配置 magic_quotes_runtime 选项
- 从oracle中删除空间表
- http接口、api接口、RPC接口、RMI、webservice、Restful等概念
- MATLAB串口通讯程序