1. 程式人生 > >求整數範圍中1的個數

求整數範圍中1的個數

code ont int true div b+ clas public 等於

一、解法

1 public int NumberOf1Between1AndN_Solution(int n) {
2             int ones = 0;
3             for (long m = 1; m <= n; m *= 10){
4                 long a = n/m, b = n%m;
5                 //對應位置>=2的時候              //對應位置為1的時候
6                 ones += (a+8)/10*m +((a%10 == 1)? (b+1):0);
7             }
8 return ones; 9 }

二、思路

1、我們每次分別求個位,十位,百位,千位等等對應的1的個數。

2、舉個例子求1-315中1的個數

2-1 首先當m=1時,a = 315,b = 0,這個時候我們求的是個位為1的個數。

此時個位的位置為5,大於2,我們用(a+8)/10來求得個位為1的數目,

此時計算(315+8)/10等於32,表示一共有32個個位為1的整數,分別為

(1,11,21,31,41,51,61,71,81,91,

101,111,121,131,141,151,161,171,181,191,

201,211,221,231,241,251,261,271,281,291,

301,311),

然後計算當個位的位置如果為1的時候,315%10 = 5, 5==1 為false,

因此此時為0,此時個位為1一共有32個。

2-2 再計算十位為1的個數,此時m=10,n=315,a=31,b=5,

(a+8)/10等於3,3*10,表示十位為1的個數有30個,分別是

(10,11,12,13,14,15,16,17,18,19,

110,111,112,113,114,115,116,117,118,119,

210,211,212,213,214,215,216,217,218,219),

然後再計算(a%10 == 1) 由於a=31,所以為true,此時代表的

十位為1的個數需要再加上(b+1)個,即6個,即十位為1的個數有

36個。

2-3 再計算百位為1的個數,此時m=100,n=315,a=3,b=15,

(a+8)/10等於1,1*100,表示百位為1的個數有100個,分別是

(100...199),再計算(a%10 == 1)為false,因此百位為1的個數

一共有100個

2-4 將個位,10位,百位加在一起一共有32+36+100 = 168個。

求整數範圍中1的個數