计算数字k在0到n中的出现的次数,k可能是0~9的一个值

来源:互联网 发布:php tp框架分页 编辑:程序博客网 时间:2024/05/21 15:44

统计数字


计算数字k在0到n中的出现的次数,k可能是0~9的一个值


例如n=12,k=1,在 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],我们发现1出现了5次 (1, 10, 11, 12)

---------------------------------------------------------------------------------------------------------------------------------------------

解题思路:

假设n是两位数,n=ab(如果n=53 的话,a=5,b=3)

1.从0到n中个位数上是k的数字一共有多少个?这要看k和b的大小。若k<b  是5+1=6个  若k>b 是5个

2.从0到n中十位数上是k的数字一共有多少个?这要看k和a的大小。若k<a  是1*10个    若k>a 是0*10个  若k=a 是 b+1=4个


假设n是三位数,n=abc(如果n=345的话,a=3,b=4,c=5)

1.从0到n中个位数上是k的数字一共多少个? k<c: 34+1=35    k>c: 34

2.从0到n中十位数上是k的数字一共多少个? k<b: 3*10          k>b:(3+1)*10      k=b: 3*10+5+1=36个

3.从0到n中百位数上是k的数字一共多少个? k<a: 1*100      k>a:0                  k=a:45+1=46个


归纳:

设一个整数为abcdef(六位数),current表示当前正在统计的i位上的数字大小(i=10的话,current=e    i=1000的话,current=c)

before为current之前的所有数字,after为current之后的所有数字(current=d的话,before=abc,after=ef)

举例:534898  current=4  before=53 after=898

从个位开始统计。直到统计完所有位。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

实现:

int digitCounts(int k, int n) {    int current=before=after=0;    int i=1,n_count=0;    while(n/i!=0){        current=(n/i)%10;        before=n/(i*10);        after=n-n/i*i;        if(current>k)            n_count=n_count+(before+1)*i;        else if(current<k)            n_count=n_count+before*i;        else            n_count=n_count+before*i+after+1;    }}


0 1
原创粉丝点击