統計數字問題:
(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]); } }
若有更好的算法,請指點。