Description

一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1, 2,…,9。给定表示书的总页码的10 进制整数n (1≤n≤10^9) 。计算书的全部页码中分别用到多少次数字0,1,2,…,9。

Input

输入数据只有1 行,给出表示书的总页码的整数n。

Output

输出数据共有10行,在第k行输出页码中用到数字k-1 的次数,k=1,2,…,10。

Sample Input

  1. 11

Sample Output

  1. 1
  2. 4
  3. 1
  4. 1
  5. 1
  6. 1
  7. 1
  8. 1
  9. 1
  10. 1
  1. import java.util.Scanner;
  2. public class Main {
  3. public static int num[] = new int[10];
  4. public static void main(String[] args) {
  5. Scanner cin = new Scanner(System.in);
  6. int n = 0;
  7. n = cin.nextInt();
  8. Count(n); // 统计00..00 - n之间的0-9数字的个数
  9. num[0] -= del_zero(get_length(n)); // 减去比如0001,0066这种多余的0的个数
  10. for (int i = 0; i < 10; i++)
  11. System.out.println(num[i]);
  12. }
  13. // 获取数字的长度
  14. public static int get_length(int num){
  15. return (int)Math.log10(num) + 1;
  16. }
  17. // 获取数字的第一位数
  18. public static int get_head(int num){
  19. return num / (int) Math.pow(10, get_length(num) - 1);
  20. }
  21. // 获取数字的余数
  22. public static int get_remainder(int num){
  23. return num % (int) Math.pow(10, get_length(num) - 1);
  24. }
  25. /* 统计00..00~n之间多余的0
  26. 比如000 - 999可以看成
  27. 0 00 - 0 99, 100 - 100
  28. 0 1 - 0 9, 10 - 99
  29. */
  30. public static int del_zero(int length){
  31. if (length == 1)
  32. return 1;
  33. return del_zero(length - 1) + (int) Math.pow(10, length - 1);
  34. }
  35. // 统计00..00 - n之间0-9数字的个数
  36. public static void Count(int n){
  37. /* f(n) = n * 10^(n-1),
  38. f(n)是n个0到n个9之间0-9的个数
  39. 比如f(2) = 20
  40. 表示00 - 99之间0有20个, 1有20个......9有20个
  41. */
  42. /* 比如34789, 分成3组0000 - 9999
  43. 0 0000 - 0 9999
  44. 1 0000 - 1 9999
  45. 2 0000 - 2 9999
  46. */
  47. for (int i = 0; i < 10; i++){
  48. num[i] = num[i] + get_head(n) * (get_length(n) - 1) * (int) Math.pow(10, (get_length(n) - 2));
  49. }
  50. /* 比如34789, 首位0, 1, 2分别加上10000个
  51. 00000 - 09999
  52. 10000 - 19999
  53. 20000 - 29999
  54. */
  55. for (int i = 0; i < get_head(n); i++){
  56. num[i] = num[i] + (int) Math.pow(10, get_length(n) - 1);
  57. }
  58. // 比如34789, 首位3, num[3]加上余数4789和特殊情况30000
  59. num[get_head(n)] += get_remainder(n) + 1;
  60. // 如果余数为0, 比如 40000, num[0] 得加上长度-1,并且余数为0时结束递归
  61. if (get_remainder(n) == 0) {
  62. num[0] += get_length(n) - 1;
  63. return;
  64. }
  65. /* 比如4000589这种情况, 直接余数递归回漏掉中间的0
  66. 所以num[0]得加上(7 - 1 - 3) * (589 + 1)
  67. */
  68. if (get_length(n) - 1 != get_length(get_remainder(n))) {
  69. num[0] += (get_length(n) - 1 - get_length(get_remainder(n))) * (get_remainder(n) + 1);
  70. }
  71. // 用余数接着递归
  72. Count(get_remainder(n));
  73. }
  74. }

统计数字问题(Java)的更多相关文章

  1. Java练习 SDUT-1704_统计数字问题

    统计数字问题 Time Limit: 1000 ms Memory Limit: 32768 KiB Problem Description 一本书的页码从自然数1 开始顺序编码直到自然数n.书的页码 ...

  2. java算法:统计数字-将数字转换成字符串,然后使用字符串String.valueOf()方法进行判断

    题目: 计算数字 k 在 0 到 n 中的出现的次数,k 可能是 0~9 的一个值. 样例 样例 1: 输入: k = 1, n = 1 输出: 1 解释: 在 [0, 1] 中,我们发现 1 出现了 ...

  3. lintcode 中等题:digits counts 统计数字

    题目 统计数字 计算数字k在0到n中的出现的次数,k可能是0~9的一个值 样例 例如n=12,k=1,在 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],我们发现 ...

  4. NOIP2007 统计数字

    1.统计数字 (count.pas/c/cpp) [问题描述] 某次科研调查时得到了 n 个自然数,每个数均不超过 1500000000(1.5*109).已知不相同的数 不超过 10000 个,现在 ...

  5. 每日一练之排序算法(P1097 统计数字)

    某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5×10^9).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果. ...

  6. 对于应用需要记录某个方法耗时的场景,必须使用clock_gettime传入CLOCK_MONOTONIC参数,该参数获得的是自系统开机起单调递增的纳秒级别精度时钟,相比gettimeofday精度提高不少,并且不受NTP等外部服务影响,能准确更准确来统计耗时(java中对应的是System.nanoTime),也就是说所有使用gettimeofday来统计耗时(java中是System.curre

    对于应用需要记录某个方法耗时的场景,必须使用clock_gettime传入CLOCK_MONOTONIC参数,该参数获得的是自系统开机起单调递增的纳秒级别精度时钟,相比gettimeofday精度提高 ...

  7. 统计数字noip2007

    7909:统计数字 总时间限制:  1000ms 内存限制:  65536kB 描述 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109).已知不相同的数不超过1000 ...

  8. 洛谷 P1097 统计数字

    P1097 统计数字 题目描述 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*10^9).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自 ...

  9. 剑指Offer-28.数组中出现次数超过一半的数字(C++/Java)

    题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如 ...

随机推荐

  1. centos8上redis5在生产环境的配置

    一,创建redis的数据和日志目录: [root@yjweb data]# mkdir /data/redis6379 [root@yjweb data]# mkdir /data/redis6379 ...

  2. Django ORM Queryset 的缓存机制, 惰性查询简述

    在Django的ORM中 必须注意由于QuerySet的 cache导致的数据获取不正确的问题 在哪些情况下不会出发QuerySet缓存? 隐式存储QuerySet(查询语句没有显示赋值给变量而直接进 ...

  3. Helium文档15-WebUI自动化-chromedriver问题

    前言 helium库是自带chromedriver的,我们怎么来查看在哪里呢? 目录介绍 用我的电脑上的路径打比方如下: D:\Program Files (x86)\Python38\Lib\sit ...

  4. 全网通4G工业路由器模块和串口转网口/4G/有线/WiFi/LTE模块的实现原理

    随着现在信息化的高速发展,网络信息的需求量大增,在移动的4G流量的场合比如汽车上实现WiFi网络覆盖,户外wifi网络覆盖需求下,4G流量已经明显不够用,而网线到达的成本比较大,难以管控.在这市场痛点 ...

  5. 关于overflow的理解

    overflow会把超出父盒子的部分继续不同修改 在这我只执行一个常用属性值 原始代码如下(未设置overflow前): 执行结果: 设置后运行结果:

  6. vue 路由知识点(一级路由与二级路由嵌套)

    本人小白一个,如果问题,麻烦大神指点, 一级路由: path:'/' 默认为显示; 二级路由: path: '',默认显示为index组件,因为二级路有没有写index组件,所以使用redirect: ...

  7. 注意由双大括号匿名类引起的serialVersionUID编译告警

    问题描述 最近版本组织清理编译告警,其中有这么一条比较有意思,之前没见过,拿出来说一说 "serializable class anonymous com.demo.Main$1 has n ...

  8. D. Alyona and Strings 解析(思維、DP)

    Codeforce 682 D. Alyona and Strings 解析(思維.DP) 今天我們來看看CF682D 題目連結 題目 略,請直接看原題. 前言 a @copyright petjel ...

  9. 谈谈Android项目框架的前世今生

    嗨,大家好,今天出了大太阳,真是美好的开始. 这篇文章和大家说说Android届流行的三大框架,了解下架构的前世今生,以及我对于这些框架的一些认识和看法. 三大框架区别 MVC 架构介绍 Model: ...

  10. Elasticsearch启动报错:future versions of Elasticsearch will require Java 11

    1 future versions of Elasticsearch will require Java 11; your Java version from [C 2 :\Program Files ...