目描述

求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
 
 
题目链接:
 
 
 
分析:
归纳总结。每个位上的1分别记算。
例: 214
个位数上的1有  21 * 1 + 1
十位数上的1有 2*10 + 5
百位数上的1有0 *100 + 1
 
 
 
 
 
public class Solution {
    public int NumberOf1Between1AndN_Solution(int n) {
        int count = 0;
        int m  = 1 ;
        //归纳总结
        //214 
        // 个位数上的1有,21*1 + 1 
        // 十位数上的1有, 2*10 + 5
        // 百位数上的1有, 0*100 + 1
        while(n >= m){
            count += (n/(m*10))*m;
            int nn = n%(m*10);
            if(nn >= 2*m){
                count += m;
            }else if(nn < m){
                
            }else{
                count += nn - m +1;
            }
            m *= 10;
        }
        return count;
        /* 每个数计算含有1的数量
        int count = 0;
        int pos = 1;
        while(pos <= n){
            int x = pos;
            while(x >0){
                if(x%10 == 1){
                    count++;
                }
                x/=10;
            }
            pos++;
        }
        return count;
        */
    }
}

 

posted on 2020-06-08 14:50  MoonBeautiful  阅读(150)  评论(0编辑  收藏  举报