1. 程式人生 > >計算數字k在0到n中的出現的次數,k可能是0~9的一個值

計算數字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;
    }
}