完美解決微軟求N包含1的個數

2021-04-29 21:45:42 字數 3616 閱讀 1555

完美解決微軟求

n包含

1的個數

benkong2009-6-17

//

問題描述

//

設函式

f(n),

其中

n ~ (0, 2^32-1)

//

為統計

0 ~ n

的所有整數所包含的

1的個數之和。1

找規律:快速求出

0-10^(n)-1之間1

的個數0-9

n11

00-99n2=10*n1+10

不考慮最高位的情況

00-09

10-19

20-29

…90-99

個位數1

的個數10*n1

最高位1

的個數10-1910 結論

:1的個數

n2=10*n1+10

000-99910*n1+10

不考慮最高位

1的個數

000-099

100-199

200-299

….900-999

總個數為

10*n2

最高位1的個數

100-199100 結論

: 1的個數

n2=10*n2+100

歸納:

000…0-999…9

n

9

結論

: 1的個數

nn=10*n(n-1)+10^(n-1)

2 分析乙個具體數

5467 求

0000-5000

的個數設

n=5(

最高位數)

先不考慮最高位

1的情況

0000-0999

1000-1999

2000-2999

3000-3999

4000-4999

1的個數字

n*n3

再考慮最高位

1的個數

若n>1,

則包含1

的個數字

1000-19991000個若

n=1,

則包含1

的個數字後面的3位數

+1 即

1000-1 ***

。如1324; 則1

的個數字

325

若n=0,

則包含1

的個數為0如

0234,

實際上退化為

3位數。

再考慮百位數

n=4,分析同上

先不考慮最高位

1的情況

000-099

100-199

200-299

300-399

1的個數字

n*n2

再考慮最高位

1的個數

若n>1,

則包含1

的個數字

100-199100個若

n=1,

則包含1

的個數字後面的2位數

+1 即

100-1 xx

。如132; 則1

的個數字33

若n=0,

則包含1

的個數為0如

5034

再考慮

10位數

分析完全同上

最後考慮個位數

若該各位

>0,

則必定包含

1否則為0

歸納

n位數中任意一位

x(各位除外

)

設***x**** 設x

後面有n

位數(n>1) 則

x包含1的個數為

若x>1,

則包含1

的個數為:

p=10^n個若

x=1,

則包含1

的個數為:

p=後面的2位數

+1 若x=0,

則包含1

的個數為:

p=0。則x

包含1的個數=x*nn+p

測試**如下:

//#include "stdafx.h"

#include #include #include #include "math.h"

//using namespace std;

void algrithom1(unsigned int n)

if(i%kk==0)

if(i==n)break;

} d=gettickcount()-d;

printf("algrithom1::the result is %d and time cost is %d/n",count,d);

}unsigned int algrithom2(unsigned int n)

//計算f(n) n ~ (0, 2^32-1)

//逐位計算

unsigned int k=n;

unsigned int count=0;

//printf("algrithom2::begin to compute.../n");

long d=gettickcount();

i=0;

while(k>0)

else

i++;

k=k/10;

} d=gettickcount()-d;

//printf("algrithom2::the result is %d and time cost is %d/n",count,d);

return count;

}//問題描述

//設函式f(n),其中 n ~ (0, 2^32-1)

//為統計0 ~ n的所有整數所包含的1 的個數之和。

int main(int argc, char* argv)

n--;

} if(n==0)printf("not find!");

getchar();

return 0;

}

求1 n中1的個數

輸入乙個整數,求1 n這n個數的十進位制表示1的個數。將n的十進位制的每一位單獨拿出討論,每一位的值記為weight。1 個位 假若n 534。534的個位從0 9變化了53次,這53我們記為round。因為weight為4 0。因此第54輪為0 4,因此1出現了count round 1。若wei...

求n個數 1 n 的質因子

求n個數 1 n 的質因子,我用到了素數篩選法的思想,例如找到素數2,2是2,4,6,8,10 的質因子,3是3,6,9,12 的質因子,然後找到素數5,若是求乙個數n的質因子,請參考 include includeint a 10001 20 b 10001 b i 表示第i個數的質因子個數,a ...

計算1到N中包含數字1的個數

mark n為正整數,計算從1到n的所有整數中包含數字1的個數。比如,n 10,從1,2.10,包含有2個數字1。相信很多人都能立刻得出以下的解法 for n n 這是最直接的解法,但遺憾的是,時間複雜程度為o n logn 因為還需要迴圈判斷當前的n的各位數,該判斷的時間複雜程度為o logn 接...