找「1」的個數

2022-07-18 22:06:30 字數 1336 閱讀 7667

1,題目

輸入乙個十進位制的數,輸出

(1)給定n,求出從1到n的所有整數中1的個數。(暫用用f(n)表示)

(2)求滿足n=f(n)的最大整數(1除外)。

2,思路

首先想到的是字串匹配的方法,但是這個方法比較麻煩,不簡便.

然後實行的方法是把數字排列出來找規律,開始找的規律是

f(10)=2,f(11)=4,f(12)=5......

f(20)=11,f(21)=12,f(22)=12........

即當某位上的數等於1和不等於1時有所不同,當它上一位上等於1時,f(n)會規律性增加。但是這個規律仍是侷限於數字的大小。

後來經過討論,得出的比較合適的方法是根據乙個數不同的位數和它周圍位數的關係來總結規律。

以abcde為例,

最高位a,出現1的次數:10000~19999跨度為10000;

第二位b,出現1的次數:1000~1999.跨度為1000;

第三位c,出現1的次數:100~199跨度為100;

第0~n -1位組成的數字乘以跨度,然後再根據當前位是大於1,等於1,等於0來加上乙個可變的數值。

具體就是,若當前位大於1,則加上跨度;若當前位等於1,則加上該位之後的尾數;若當前位等於0,則加0;具體在個位上時有不同。

3,**與截圖

非遞迴演算法:

遞迴演算法:

#includeusing

namespace

std;

intmain()

if (count ==i)

}cout

<< "

『1』的個數為:

4,總結

遞迴演算法來解決問題減少了很多麻煩,很簡便。

實現程式首先要融入和了解數學思維。迴圈等程式設計方法都是從數學積累而來。

要得到數學規律要基於大量的事實基礎,規律要找對找準。

找數字個數

lulu喜歡小於等於1000的正整數,但是如果某個數是a或b的倍數,lulu會討厭這個數。如果某個數里包含了a和b兩個數里包含的數,lulu也會討厭。例如a 14,b 23,如果數字中包含1 2 3 4這四個數中的任意乙個數,lulu就會討厭這個數 現在告訴你a,b,你能說出lulu喜歡的數有多少個...

找數字個數

lulu喜歡小於等於1000的正整數,但是如果某個數是a或b的倍數,lulu會討厭這個數。如果某個數里包含了a和b兩個數里包含的數,lulu也會討厭。例如a 14,b 23,如果數字中包含1 2 3 4這四個數中的任意乙個數,lulu就會討厭這個數 現在告訴你a,b,你能說出lulu喜歡的數有多少個...

找最大的N個數

題目 找最大的n個數 時間限制1000 ms,記憶體限制256000 kb,長度限制8000 b。給定n個整數,找最大的前m個數 不一定有序 要求時間複雜度盡量低。先輸入n和m 1 m n 50000 然後下面n行每行代表乙個整數 每個整數在int範圍內 輸出有m行,每行乙個整數,表示最大的m個數。...