统计数字问题:
(1)、问题描述
一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1, 2,…,9。
(2)、算法设计
给定表示书的总页码的10 进制整数n (1≤n≤10) 。编程计算书的全部页码中分别用到多少次数字0,1,2,…,9。
java实现
public class Lab101 { public static void main(String[] args) { Lab101 lab = new Lab101(); lab.func(9); for (int i = 0; i < 10; i++) System.out.println(i + "统计:" + lab.stat[i]); } int stat[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; public void func(int num) { int tmp = num; while (tmp >= 10) { stat[tmp % 10]++; tmp /= 10; } stat[tmp]++; if (num > 0) func(--num); } }
上面的方法因为递归比较多,java虚拟机的栈数量有限制,会出现java.lang.StackOverflowError错误,所以就改用循环方法
public class Lab101 { public static void main(String[] args) { int stat[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; for (int i = 1000; i < 100000; i++) { int tmp = i; while (tmp >= 10) { stat[tmp % 10]++; tmp /= 10; } stat[tmp]++; } for (int j = 0; j < 10; j++) System.out.println(j + "统计:" + stat[j]); } }
若有更好的算法,请指点。