演算法 數字遞增的數

2021-10-10 14:47:25 字數 1318 閱讀 6337

2. 解決方案

3. 資源分享

題目:演算法-數字遞增的數-

問題描述:

乙個正整數如果任何乙個數字不大於右邊相鄰的數字,則稱為乙個數字遞增的數,

例如1135是乙個數字遞增的數,而1024不是乙個數字遞增的數.

給定正整數 n,請問在整數 1 至 n 中有多少個數字遞增的數?

輸入:

輸入的第一行包含乙個整數 n。

輸出:輸出一行包含乙個整數,表示答案。

樣例輸入:

30樣例輸出:

26

這是一道初級演算法題,較為容易,演算法核心點在於對於整形數的認識,快速解出題目是我們的終極目標;

雖然這是一道初級演算法題,但是有很多高階的演算法題類似整形數問題都是由此演變而來的,注重底層細節是我們寫演算法的程式猿必不可少的素質;

而本題最重要的底層細節就是整形數的處理,一般我們會想到利用c++的stl容器string字串類物件去解決,即下面解決方案的第乙個宣告函式checkincreasebystring,從字串尾開始向前比較,只要有乙個不符合遞增規律就說明不滿足題意直接返回false即可,表示這個整形數不是數字遞增的數,如果正常退出比較迴圈說明這是乙個數字遞增的數,返回true表示,然後相應的讓我們預先定義的計數器+1就行,最後按照題目要求輸出即可;

需要注意的點就是這類整形數題目有多種解決方法,可以利用字串string類物件的函式,也可以利用數學計算的特點,比如求餘運算等對整形數做處理。針對這兩種方法呢,我進行了效能測試,最後發現利用string類物件的方法效能較差,效能上兩者至少差了10倍,這也啟示我們類雖然解決了**復用的問題,封裝了很多函式屬性等,給我們程式猿帶來很大便利,但很多優秀的演算法的核心其實是依靠的程式猿的思維過程,乙個程式猿很熟悉底層細節,那麼他就能設計出乙個針對某個問題效率很高的演算法,這一點是母庸質疑的!

#include

#include

using

namespace std;

bool

checkincreasebystring

(int t)

;bool

checkincreasebyinteger

(int t)

;int

main()

bool

checkincreasebystring

(int t)

bool

checkincreasebyinteger

(int t)

return

true

;}

藍橋模擬題 數字遞增的數

問題描述 乙個正整數如果任何乙個數字不大於右邊相鄰的數字,則稱為乙個數字遞增的數,例如1135是乙個數字遞增的數,而1024不是乙個數字遞增的數。給定正整數 n,請問在整數 1 至 n 中有多少個數字遞增的數?輸入格式 輸入的第一行包含乙個整數 n。輸出格式 輸出一行包含乙個整數,表示答案。樣例輸入...

演算法題 單調遞增的數字

給定乙個非負整數 n,找出小於或等於 n 的最大的整數,同時這個整數需要滿足其各個位數上的數字是單調遞增。當且僅當每個相鄰位數上的數字 x 和 y 滿足 x y 時,我們稱這個整數是單調遞增的。示例 1 輸入 n 10 輸出 9 示例 2 輸入 n 1234 輸出 1234 示例 3 輸入 n 33...

演算法 數字的全排列 遞迴

對於數字的全排列問題,相比於使用窮舉法來說,通過遞迴法來解決可以大大減少演算法的時間複雜度與空間複雜度,使用遞迴演算法的好處即是 拋給程式乙個執行條件,乙個約束條件 結束遞迴過程 程式便可自己完成所有過程。輸入乙個數字n,使用遞迴演算法輸出1 n所有的排列 全排列問題 includeusing na...