参考《编程之美》132页求数字中1的个数java
/** * 牛牛新买了一本算法书,算法书一共有n页,页码从1到n。牛牛因而想了一个算法题目:在这本算法书页码中0~9每一个数字分别出现了多少次? * * @author pomay * */ import java.util.Scanner; public class Nowcode_pagecount { static int count1to9(int n, int i) { int num = 0; int temp = 1;// 从个位开始 int low = 0; // 记录当前位的低位 int orig = n; while (n != 0) { // 若是当前位数大于这个数 if (n % 10 > i) { // (高位+1)x位数 num += (n / 10 + 1) * temp; // 若是当前位数小于这个数 } else if (n % 10 < i) { // 高位*位数 num += (n / 10) * temp; // 若是当前位数等于这个数 } else { // 高位*位数+低位+1 num += (n / 10) * temp + (low + 1); } temp *= 10; low = orig - (orig / temp) * temp; n /= 10; } return num; } static int count0(int n) { int num = 0; int temp = 1; int low = 0; int orig = n; while (n != 0) { if (n % 10 == 0) { num += (n / 10 - 1) * temp + (low + 1); } else { num += (n / 10) * temp; } temp *= 10; low = orig - (orig / temp) * temp; n /= 10; } return num; } public static void main(String[] args) { // 输入包括一个整数n(1 ≤ n ≤ 1,000,000,000) Scanner s = new Scanner(System.in); int n = s.nextInt(); int[] nums = new int[10]; // 方法二:计算1-9的个数和计算0的个数 nums[0] = count0(n); for (int i = 1; i < 10; i++) { nums[i] = count1to9(n, i); } for (int i = 0; i < nums.length; i++) { if (i < nums.length - 1) System.out.print(nums[i] + " "); else System.out.print(nums[i]); } //// 方法一:暴力解法从头开始计算 // for (int i = 1; i <= n; i++) // { // // 把页数转换成字符存入数组 // char[] c = String.valueOf(i).toCharArray(); // for (int j = 0; j < c.length; j++) // { // // 字符转换成整数 // int m = c[j] - '0'; // nums[m] += 1; // } // } // for (int i = 0; i < nums.length; i++) // { // if (i < nums.length - 1) // System.out.print(nums[i] + " "); // else // System.out.print(nums[i]); // } } }