Swift-1的数目

给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数.

暴力解法

最简单的办法就是遍历,分别统计每个数字出现的次数:
<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>

数学解法

数学解法需要比较常的分析,忽略证明过程,简单给出逻辑如下:
对于数abcde,c这位出现1的次数分以下情况:
1.若c == 0,结轮是 ab * 100;
2.若c == 1,结论是(ab)* 100 + de + 1;
3.若c > 1,结论是(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>

通用解法

假设求解的不是1的数目,而是其他数字呢,限制范围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>

测试代码:
<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的个数---\(statisResult)---\(statisResult2)") print("FlyElephant--1...\(maxNum)中2的个数---\(statisResult3)")</code></pre>

FlyElephant.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 你的数学直觉怎么样?你能凭借直觉,迅速地判断出谁的概率大,谁的概率小吗?下面就是 26 个这样的问题。如果你感兴趣...
    cnnjzc阅读 7,401评论 0 12
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,858评论 18 399
  • 2017年10月24日晚,天气微凉。 吃过晚饭,我们滑县语文组的老师们不顾一天的劳累,便早早在河师大文学院...
    和风细雨_0e83阅读 745评论 0 1
  • APP插件化/组件化框架分析 一、宿主程序集成 1、在宿主工程根目录的build.gradle添加依赖 2、在Ap...
    闲庭阅读 2,519评论 0 3
  • 不知道从什么时候开始,仪式成为一种流行文化,“仪式感”也是鸡汤文中不厌其烦提到的一个词。那么,今天我们来研究一下仪...
    了了Vita阅读 1,267评论 0 4

友情链接更多精彩内容