统计数字问题(Java)
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)的更多相关文章
- Java练习 SDUT-1704_统计数字问题
统计数字问题 Time Limit: 1000 ms Memory Limit: 32768 KiB Problem Description 一本书的页码从自然数1 开始顺序编码直到自然数n.书的页码 ...
- java算法:统计数字-将数字转换成字符串,然后使用字符串String.valueOf()方法进行判断
题目: 计算数字 k 在 0 到 n 中的出现的次数,k 可能是 0~9 的一个值. 样例 样例 1: 输入: k = 1, n = 1 输出: 1 解释: 在 [0, 1] 中,我们发现 1 出现了 ...
- 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],我们发现 ...
- NOIP2007 统计数字
1.统计数字 (count.pas/c/cpp) [问题描述] 某次科研调查时得到了 n 个自然数,每个数均不超过 1500000000(1.5*109).已知不相同的数 不超过 10000 个,现在 ...
- 每日一练之排序算法(P1097 统计数字)
某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5×10^9).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果. ...
- 对于应用需要记录某个方法耗时的场景,必须使用clock_gettime传入CLOCK_MONOTONIC参数,该参数获得的是自系统开机起单调递增的纳秒级别精度时钟,相比gettimeofday精度提高不少,并且不受NTP等外部服务影响,能准确更准确来统计耗时(java中对应的是System.nanoTime),也就是说所有使用gettimeofday来统计耗时(java中是System.curre
对于应用需要记录某个方法耗时的场景,必须使用clock_gettime传入CLOCK_MONOTONIC参数,该参数获得的是自系统开机起单调递增的纳秒级别精度时钟,相比gettimeofday精度提高 ...
- 统计数字noip2007
7909:统计数字 总时间限制: 1000ms 内存限制: 65536kB 描述 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109).已知不相同的数不超过1000 ...
- 洛谷 P1097 统计数字
P1097 统计数字 题目描述 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*10^9).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自 ...
- 剑指Offer-28.数组中出现次数超过一半的数字(C++/Java)
题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如 ...
随机推荐
- centos6.8 配置 yum 仓库
挂载方式 mkdir /mnt/cdrom 加载光盘: mount /dev/cdrom /mnt/cdrom/ 挂载光盘到 /mnt/cdrom/ 挂载成功 cd /etc/yum.repos.d/ ...
- 探索ParNew和CMS垃圾回收器
前言 上篇文章我们一起分析了JVM的垃圾回收机制,了解了新生代的内存模型,老年代的空间分配担保原则,并简单的介绍了几种垃圾回收器.详细内容小伙伴们可以去看一下我的上篇文章:秒懂JVM的垃圾回收机制. ...
- 连肝三个通宵,JVM77道高频面试题详细分析,就这?
为方便大家记忆,记得收藏加关注哦 ,需要下载PDF版本请在公众号[程序员空间]回复"资料"即可获取下载方式,你也可以 点在文末微信扫描二维码关注! 1.java 中会存在内存泄漏吗 ...
- JS里各种类型的循环
for... for( 初始条件; 判断条件; 递增条件 ) { ... } for ... in 可以把一个对象里面的所有属性依次循环出来 var person = { name: 'Jack', ...
- Lock接口示例
Lock 的挂起 await() 唤醒signal() Lock 简单示例 public class LockDemo { public static void main(String[] args ...
- Lombda表达式(五)
public class Test05 { /* * lambda表达式是用来简化匿名内部类的一种函数式编程的语法. * 只有SAM接口才能使用lambda表达式 * 方法引用和构造器引用是用来简化l ...
- Redis---06主从复制(薪火相传)
一.什么是薪火相传模式 上一个slave(从机)是下一个slave(从机)的Master(主机) 二.为什么要这样 优点:从机同样可以接收其他从机的连接和同步请求,那么该从机作为了链条中下一个的主机, ...
- Java反射:new一个宝可梦吧
最近写Spring Boot的测试用例会发现经常会有用到@RunWith(SpringRunner.class)的设置注解,关于SpringRunner.class的理解也有点似是而非.其实这种写法是 ...
- PLC模拟量输入和数字量输入是什么
数字信号输入输出: 就是开关闭合,断开. 模拟量输入输出: 就是一个数值.比如:液位1.5米,温度30度,这样的数. 输入单元 输入单元是PLC与被控设备相连的输入接口,是信号进入PLC的桥梁,它的作 ...
- NB-IoT的RLC子层服务功能
NB-IoT只支持RLC子层的确认模式(Acknowledgement Mode,AM),不支持非确认模式(Unacknowledged Mode,UM). 对于支持UP模式的UE,NB-IoT支持R ...