問題明確而簡單.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數字的個數.