十進制整數N,計算從1到N的所有整數中1出現的次數

解析:

通過使用一個 位置乘子m 遍歷數字的位置, m 分別為1,10,100,1000…etc.

對于每個位置來說,把10進制數分成兩個部分,比如說 當m=100的時候, 把十進制數 n=3141592 分成 a=31415 和 b=92 ,以此來分析百位數為1時所有數的個數和。m=100時,百位數的前綴為3141,當百位數大于1時,為3142*100,因為當百位數大于1時,前綴可以為0,即百位數可以從100到199,共100個數;當百位數不大于1時,為3141*100;如何判斷百位數是否大于1?假設百位數為x,若(x+8)/10等于1,則大于1,若(x+8)/10等于0,則小于1。因此前綴可用(n/m + 8)/10 *m來計算(若計算2的個數,可以改為(n/m + 7)/10*m,若計算3的個數,改為(n/m + 6)/10*m,…以此類推)。

再例如m=1000時,n分為a=3141和 b=592;千位數的前綴為314,千位數不大于1,故前綴計算為314*1000;因為千位數為1,再加b+1(0到592)。即千位數為1的所有書的個數和為314*1000+592+1;公式(n/m + 8)/10*m + b +1。

注:只有n的m位為1時需要計算后綴,后綴計算為 (n/m%10==1)*(b+1),

即(n/m%10==1)判斷第m位是否為1,若為1,則加上(b+1),若不為1,則只計算前綴。(若計算2的個數,可以改為(n/m%10==2)*(b+1),若計算3的個數,可以改為(n/m%10==3)*(b+1)…以此類推)

代碼

int NumberOf1(int n)

{

int ones = 0;

int a=0;

int b=0;

for (long long m = 1; m <= n; m *= 10)

{

a = n / m;

b = n%m;

ones += (a+ 8) / 10 * m + (a? ? % 10 == 1) * (b + 1);

}

return ones;

}?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容