java牛牛新买了一本算法书,算法书一共有n页,页码从1到n。牛牛因而想了一个算法题目:在这本算法书页码中0~9每一个数字分别出现了多少次?

参考《编程之美》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]);
		// }
	}
}