天天看点

编程之美--1的数目

/**
 * 求1 的个数
 * 
 * 对于 abcdef 几个数字,我们求小于abcdef 的所有数据中包含的1的个数,如果 P(13) = 6 对于分析,我们能得出以下结论 如:对于 c
 * 位上的数有以下三种情况 1. c=0 p= c 高位的数字 * C的位数 2. c=1 p = c 高位的数字*c的位数 + c 低位的数 3. c>1
 * p = (c高位的数字+1) *c 位数
 */
public class TheNumberOfOne {

    static void execute(int n) {
	int factor = 1, high, low;
	int count = 0;
	while (n / factor != 0) { // 表示还有高位
	    int pos = n / factor % 10; // 当前位值
	    high = n / (factor * 10);
	    low = n - (n / factor) * factor;// 高位与低位值
	    switch (pos) {
	    case 0:
		count += high * factor;
		break;
	    case 1:
		count += high * factor + low + 1;
		break;
	    default:
		count += (high + 1) * factor;
		break;
	    }
	    factor *= 10;
	}
	System.out.println(count);
    }

    public static void main(String args[]) {
	int n = 123;
	execute(n);
    }
}