**: mark
n為正整數,計算從1到n的所有整數中包含數字1的個數。比如,n=10,從1,2...10,包含有2個數字1。
相信很多人都能立刻得出以下的解法:
for(n:n)
這是最直接的解法,但遺憾的是,時間複雜程度為o(n*logn)。因為還需要迴圈判斷當前的n的各位數,該判斷的時間複雜程度為o(logn)。
接下來就應該思考效率更高的解法了。說實話,這道題讓我想起另外一道簡單的演算法題:
n為正整數,計算從1到n的整數和。
很多人都採用了迴圈求解。然後利用初等數學知識就知道s=n*(n+1)/2,所以用o(1)的時間就可以處理。
再回到本道題目,同理應該去尋找到結果r與n之間的對映關係。
分析如下:
假設n表示為a[n]a[n-1]...a[1],其中a[i](1<=i<=n)表示n的各位數上的數字。
c[i]表示從整數1到整數a[i]...a[1]中包含數字1的個數。
x[i]表示從整數1到10^i - 1中包含數字1的個數,例如,x[1]表示從1到9的個數,結果為1;x[2]表示從1到99的個數,結果為20;
當a[1]=0時,c[1] = 0;
當a[1]=1時,c[1] = 1;
當a[1]>1時,c[1] = 1;
當a[2]=1時,c[2] = a[1] +1+ c[1] + x[1];
當a[2]>1時,c[2] = a[2]*x[1]+c[1]+10;
當a[3]=1時,c[3] = a[2]*a[1] +1+ c[2] + x[2];
當a[3]>1時,c[3] = a[3]*x[2]+c[2]+10^2;
......
以此類推
當a[i]=1時,c[i] = a[i-1]*...*a[1] +1+ c[i-1]+x[i-1];
當a[i]>1時,c[i] = a[i]x[i-1]+c[i-1]+10^(i-1);
**:
intmain()
else
n2=10*n2+n3;
n1=n1/10
; x=10*x+y;
y=y*10
; }
cout
return0;
}
計算0到N中包含數字1的個數(整合)
有這樣乙個函式f n 對於任意正整數n,它表示從 0 到 n 之間出現 1 的個數,比如 f 1 1,f 13 6,請列出從 1 到 1234567890 中所有的 f n n 的n,要求準確快速.相信很多人都能立刻得出以下的解法 for n n 這是最直接的解法,但遺憾的是,時間複雜程度為o n ...
計算1到n的數字中1的出現的次數
主要思路 計算數字每一位出現1的次數,並相加,得到該數字中1出現的次數。例如 1304中,個位出現1的次數,是131次,即1304 10 1 131 十位出現1的次數 1304 100 10 130 百位出現1的次數 1304 1000 1 100 200 千位出現1的次數 1304 10000 1...
計算正整數1到N中出現的1的個數
題目 1到n中,出現的1的個數 假設1到某個數12x01,設百位上的數字出現1的次數,假設百位上的數字x 0,百位上出現1的情況由100 199,1100 1199,2100 2199 3100 3199,11100 11199,總共1200個,當前位的高位為12,有12 100。假設x 1,百位上...