编程之美--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);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值