給定一個(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>
