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

11

Sample Output

1
4
1
1
1
1
1
1
1
1
import java.util.Scanner;

public class Main {
public static int num[] = new int[10];
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = 0;
n = cin.nextInt();
Count(n); // 统计00..00 - n之间的0-9数字的个数
num[0] -= del_zero(get_length(n)); // 减去比如0001,0066这种多余的0的个数
for (int i = 0; i < 10; i++)
System.out.println(num[i]);
}
// 获取数字的长度
public static int get_length(int num){
return (int)Math.log10(num) + 1;
}
// 获取数字的第一位数
public static int get_head(int num){
return num / (int) Math.pow(10, get_length(num) - 1);
}
// 获取数字的余数
public static int get_remainder(int num){
return num % (int) Math.pow(10, get_length(num) - 1);
}
/* 统计00..00~n之间多余的0
比如000 - 999可以看成
0 00 - 0 99, 100 - 100
0 1 - 0 9, 10 - 99
*/
public static int del_zero(int length){
if (length == 1)
return 1;
return del_zero(length - 1) + (int) Math.pow(10, length - 1);
}
// 统计00..00 - n之间0-9数字的个数
public static void Count(int n){
/* f(n) = n * 10^(n-1),
f(n)是n个0到n个9之间0-9的个数
比如f(2) = 20
表示00 - 99之间0有20个, 1有20个......9有20个
*/ /* 比如34789, 分成3组0000 - 9999
0 0000 - 0 9999
1 0000 - 1 9999
2 0000 - 2 9999
*/
for (int i = 0; i < 10; i++){
num[i] = num[i] + get_head(n) * (get_length(n) - 1) * (int) Math.pow(10, (get_length(n) - 2));
}
/* 比如34789, 首位0, 1, 2分别加上10000个
00000 - 09999
10000 - 19999
20000 - 29999
*/
for (int i = 0; i < get_head(n); i++){
num[i] = num[i] + (int) Math.pow(10, get_length(n) - 1);
}
// 比如34789, 首位3, num[3]加上余数4789和特殊情况30000
num[get_head(n)] += get_remainder(n) + 1;
// 如果余数为0, 比如 40000, num[0] 得加上长度-1,并且余数为0时结束递归
if (get_remainder(n) == 0) {
num[0] += get_length(n) - 1;
return;
}
/* 比如4000589这种情况, 直接余数递归回漏掉中间的0
所以num[0]得加上(7 - 1 - 3) * (589 + 1)
*/
if (get_length(n) - 1 != get_length(get_remainder(n))) {
num[0] += (get_length(n) - 1 - get_length(get_remainder(n))) * (get_remainder(n) + 1);
}
// 用余数接着递归
Count(get_remainder(n));
}
}

统计数字问题(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平台使用vmstat监控系统

    一,vmstat的用途和特点: vmstat 是一个常用的系统性能分析工具,主要用来分析系统的内存使用情况,也常用来分析 CPU 上下文切换和中断的次数. 相对于 iostat 来说,vmstat 可 ...

  2. 基于Docker的MySql

    MySQL Server安装教程 考虑到实际情况需要经常使用MySQL,为了方便大家能够快速基于Docker搭建MySQL这里以Linux下为例 进行说明,对于Windows用户来说直接通过查看官网H ...

  3. GeoServer发布shapfile字段名和值乱码问题解决

    摘要: 网上说了一大堆方法又是转格式咯又是改源代码了,修改很简单: 修改Styles下的你的style: Xml代码 修改Stores下你的图层的属性,设置 DBF charset为GBK 以上设置G ...

  4. Python核心编程之生成器

    生成器 1. 什么是生成器 大家知道通过列表生成式(不知道的可自行百度一下),我们可以直接创建一个列表,但是,受内存限制,列表内容肯定是有限的.比如我们要创建一个包含100万个元素的列表,这100万个 ...

  5. 为啥 Response.Write 后,View就不渲染了?

    一:背景 1. 讲故事 前几天群里有一位朋友聊到,为什么我在 Action 中执行一句 Response.Write 之后,后续的 View 就不呈现了,如果脑子中没有画面,那就上测试代码: publ ...

  6. Asp.Net实现局部刷新,ScriptManager和UpdatePanel控件的使用

    <asp:CheckBoxList ID="LimitCollegeNo" runat="server" CellPadding="5" ...

  7. buuctf-misc [BJDCTF2020]认真你就输了

    下载压缩包,打开发现有一个10.xls打开一乱码,发现不了头绪,但是发现了pk开头 那我们能不能将这个.xls改成.zip 说干就干,于是我们改成zip解压 打开xl,然后再打开 在chars中发现f ...

  8. Vue(学习第三部 自动化工具 [vue-cli])

    目录 Vue自动化工具(Vue-cli) 安装nide.js npm 安装Vue-sli 使用Vue-处理初始化创建起那段项目 vue项目执行流程图 单文件组件的使用 template 编写HTML代 ...

  9. c#封装ActiveX接口实践分析

    ActiveX接口 是一个开放的集成平台,为开发人员.用户和 Web生产商提供了一个快速而简便的在 Internet 和 Intranet 创建程序集成和内容的方法. 使用 ActiveX, 可轻松方 ...

  10. 涨知识的一个pwn题:de1ctf_2019_weapon

    没做出来,wtcl,看了师傅们的wp才找到思路,收获了很多 怎么说呢,这个题很简单但是很巧妙,逆起来几乎无难度 漏洞点位于free函数,一个简单的UAF漏洞 然后接下来说说我一开始的思路 由于程序没有 ...