完美解決微軟求
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 接...