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