問題明確而簡單.for迴圈肯定是不好的.
用遞推方法:
定義h(n)=從1到9999.....9999 ( n 個 9)之間含有1的數字的個數.定義f(n)為n位數中含有1的數字的個數.
由定義可知:h(n)=f(1)+f(2)+f(3)+....+f(n);
則f(1)=h(1)=1;
f(2)=10^1+8*h(1).
f(3)=10^2+8*h(2).
f(4)=10^3+8*h(3).
......
意義如下:f(4)是乙個四位數,假如最高位(千位)為1,那麼後面是啥都行,這個數字必然有1了,所以是10^3.
假如最高位不是1,最高位不能是0(不然就成3位數了),所以最高位有8種選擇2,3,4,5,6,7,8,9.這樣一來,低三位中必須含有1,要不然就沒有一了.所以乘上h(3).
下面舉乙個例子,求1到2345之間含有1數字的個數.
2345=h(1)+h(2)+h(3)+h(4)的一部分.
關鍵是h(4)的一部分應該怎麼求.定義p(4,2)表示是四位數並且雖高位小於2的數中含有1的個數.p(4,2)=10^3+p(3,3);看到這裡就應該明白了.p(3,3)表示三位數中最高位小於3的含1數字的個數.
求n個自然數中每個數字出現的次數
問題描述 某次科研調查時得到了n個自然數,每個數均不超過15億 1.5 109 已知不相同的數不超過10000個,現在需要統計這些自然數各自出現的次數,並按照自然數從小到大的順序輸出統計結果。思路 1.用數組裝下所有數,之後利用排序 函式對陣列中的所有元素進行排序 2.將第乙個元素定為哨兵,定義co...
排列組合 從n個自然數中取出r個數的組合
這種題目一般有兩種方法,比較直接的方法就是使用循壞,但是對於這種方法只有r小於等於4時才是可行的,這個時候複雜度是 o n r 可知,這種方法的時間複雜度很高,而且這種迴圈機制嚴重依賴r,通過r來控制迴圈層數,因此這種方法不具有普遍性。最常用的方法就是使用遞迴。在迴圈演算法設計中,每個組合中的資料都...
求 從m個自然數中任取n個數的所有組合
問題 編寫乙個遞迴演算法,找出從自然數1,2,3,m中任取n個數的所有組合。例如 m 5,n 3時,所有組合為543,542,541,532,531,521,432,431,421,321。方法1 設這m個自然數存放在整數陣列a k 中,a i 存放i 1 0 i n 1 可採用遞迴演算法,例如,m...