整数中1出现的次数

题目描述

求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
 

 思考: 可以考虑用递归的方式,那么,递归什么时候截止呢? 递归到个位数!      
      ( 不对,从高位到低位进行递归, 不如从低位到高位进行递归方便     不对,就得从高位到低位递归!!!)
  比如2034  ,   0到9  有1个1       0到99 有 20个1      0到999  有 10*f(99)+100=300   
      所以2024= 2*f(999)+1000  +2*f(9)+10  +1
 
没能通过所有测试用例:
public class Solution {
    public int NumberOf1Between1AndN_Solution(int n) {
        int res=0,a1=1,a2=0,b=1;
        while(n>0){
            int num=n%10;
            a1=a1*b;
            res=res+a1+(num+1)*a2;
            a2=a1;
            b=b*10;
            n=n/10;
        }
        return res;
    }
}

 

  判断每一位的数字!  将数字分为 :  高位  当前位  低位。 根据当前位的数值不同进行不同的处理!!!!

class Solution {
    public int countDigitOne(int n) {
        int digit=1,res=0;
        int high=n/10,cur=n%10,low=0;
        while(high!=0 || cur!=0){
            if(cur==0)
                res=res+high*digit;
            else if(cur==1)
                res=res+high*digit+low+1;
            else if(cur>1)
                res=res+(high+1)*digit;
            low=low+cur*digit;
            cur=high%10;
            high=high/10;
            digit=digit*10;
        }
        return res;
    }
}

 

 

 

posted @ 2020-08-04 13:05  你眼里的星辰  阅读(113)  评论(0)    收藏  举报