Swift-1的數(shù)目

給定一個(gè)十進(jìn)制正整數(shù)N,寫下從1開始,到N的所有整數(shù),然后數(shù)一下其中出現(xiàn)的所有“1”的個(gè)數(shù).

暴力解法

最簡(jiǎn)單的辦法就是遍歷,分別統(tǒng)計(jì)每個(gè)數(shù)字出現(xiàn)的次數(shù):
<pre><code>` func sumls(num:Int) -> Int {
var count:Int = 0

    for i in 1...num {
        var temp:Int = i
        while temp != 0 {
            count += temp % 10 == 1 ? 1 : 0
            temp /= 10
        }
    }

    return count
}`</code></pre>

數(shù)學(xué)解法

數(shù)學(xué)解法需要比較常的分析,忽略證明過程,簡(jiǎn)單給出邏輯如下:
對(duì)于數(shù)abcde,c這位出現(xiàn)1的次數(shù)分以下情況:
1.若c == 0,結(jié)輪是 ab * 100;
2.若c == 1,結(jié)論是(ab)* 100 + de + 1;
3.若c > 1,結(jié)論是(ab + 1)* 100;
<pre><code>` func sumlsSimple(num:Int) -> Int {
if num <= 0 {
return 0
}
var factor = 1
var lowNum:Int = 0
var curNum:Int = 0
var highNum:Int = 0

    var count:Int = 0
    let n:Int = num
    
    while n / factor != 0 {
        lowNum = n - (n / factor) * factor
        curNum = (n / factor) % 10
        highNum = n / (factor * 10)
        
        if curNum == 0 {
            count += highNum * factor
        } else if curNum == 1 {
            count += highNum * factor + lowNum + 1
        } else {
            count += (highNum + 1) * factor
        }
        
        factor *= 10
    }
    
    return count
}`</code></pre>

通用解法

假設(shè)求解的不是1的數(shù)目,而是其他數(shù)字呢,限制范圍1~9,第二種解法稍微修改即可.
<pre><code>` func sumlsCommon(num:Int,target:Int) -> Int {
if num <= 0 || (target < 1 || target > 9){
return 0
}
var factor = 1
var lowNum:Int = 0
var curNum:Int = 0
var highNum:Int = 0

    var count:Int = 0
    let n:Int = num
    
    while n / factor != 0 {
        lowNum = n - (n / factor) * factor
        curNum = (n / factor) % 10
        highNum = n / (factor * 10)
        
        if curNum < target {
            count += highNum * factor
        } else if curNum == target {
            count += highNum * factor + lowNum + 1
        } else {
            count += (highNum + 1) * factor
        }
        
        factor *= 10
    }
    
    return count
}`</code></pre>

測(cè)試代碼:
<pre><code>var maxNum:Int = 123 var statisResult:Int = statis.sumls(num: maxNum) var statisResult2:Int = statis.sumlsSimple(num: maxNum) var statisResult3:Int = statis.sumlsCommon(num: maxNum, target: 2) print("FlyElephant--1...\(maxNum)中1的個(gè)數(shù)---\(statisResult)---\(statisResult2)") print("FlyElephant--1...\(maxNum)中2的個(gè)數(shù)---\(statisResult3)")</code></pre>

FlyElephant.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 你的數(shù)學(xué)直覺怎么樣?你能憑借直覺,迅速地判斷出誰的概率大,誰的概率小嗎?下面就是 26 個(gè)這樣的問題。如果你感興趣...
    cnnjzc閱讀 7,466評(píng)論 0 12
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,734評(píng)論 18 399
  • 2017年10月24日晚,天氣微涼。 吃過晚飯,我們滑縣語文組的老師們不顧一天的勞累,便早早在河師大文學(xué)院...
    和風(fēng)細(xì)雨_0e83閱讀 788評(píng)論 0 1
  • APP插件化/組件化框架分析 一、宿主程序集成 1、在宿主工程根目錄的build.gradle添加依賴 2、在Ap...
    閑庭閱讀 2,544評(píng)論 0 3
  • 不知道從什么時(shí)候開始,儀式成為一種流行文化,“儀式感”也是雞湯文中不厭其煩提到的一個(gè)詞。那么,今天我們來研究一下儀...
    了了Vita閱讀 1,282評(píng)論 0 4

友情鏈接更多精彩內(nèi)容