每日一题--从1到n整数中1出现的次数

从数字规律来分析

一位数的情况
1.大于等于1的时候,有1个;
2.小于1的时候,有0个。
两位数的情况:
》》个位数的情况:
1.如果个位数大于等于1,则个位数出现1的次数==十位数上的数字+1;
2.如果个位数等于0,则个位数出现1的次数==十位数上的数字
》》十位数的情况:
1.如果十位数上的数字等于1,则十位数出现1的次数==个位数上数字+1;
2.如果十位数上的数字大于1,则十位数出现1的次数==10;


更一般的情况:输入一个数字N,百位上出现1的次数
1.如果百位上数字为0,则百位上出现1的次数由更高位决定:等于更高位数字乘以当前位数
例如:12013,百位上出现1的情况:100~199,1100~1199,2100~2199.。。。。11100~11199 等于12*100;
2.如果百位上数字大于1,则百位上出现1的次数由更高位决定:等于更高位数字+1然后乘以当前位数
例如:12213 ,百位上出现1的次数为:(12+1)*100
3.如果百位上数字为1,则百位上出现1的次数由更高位和更低位共同决定:
例如:12113,百位上出现1的次数:①高位影响:1200,②低位影响:13+1;

package Thread;

/**
 *问题描述:从1到n整数中1出现的次数
 * 输入:12---(1,10,11,12)
 * 输出:1一共出现了5次
 * Created by lxq on 2017/9/5.
 */
public class Problem4 {
    public static void main(String[] args){
        Problem4 problem4 = new Problem4();
        System.out.println(problem4.countOne(123));
    }
    public long countOne(long n){
        long count = 0;
        long i =1;
        long current = 0,after = 0,before = 0;
        while((n/i)!=0){
            // 12213/100=122;122%10=2,为百位上数字
            current = (n/i)%10; //当前位数字
            // 12213/(100*10)=12,百威以上数字
            before = n/(i*10);//高位数字
            // 12113-(12113/100)*100=13,百位以下数字
            after = n-(n/i)*i;//低位数字
            if(current>1)
                count = count+(before+1)*i;
            else if(current==0)
                count = count +before*i;
            else if(current==1)
                count = count+before*i+after+1;
            i=i*10;
        }
        return  count;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值