美文网首页
随记算法题-枚举算法-可被3、5、7整除的数

随记算法题-枚举算法-可被3、5、7整除的数

作者: 颠趴高手 | 来源:发表于2021-10-26 11:09 被阅读0次

    前言

    最近在学习算法题,周末无事闲逛图书馆,偶然在一本算法书中看到枚举算法,其中的一个案例感觉很有趣就特此做个记录。


    问题

    输入一个正整数num,判断num是否能被3,5,7整除,并输出以下信息:
    (1)能同时被3,5,7整除。
    (2)能同时被其中两个数(要指出哪两个数)整除。
    (3)能被其中一个数整除。
    (4)不能被任何一个整除。


    解题

    最直接、暴力的方式就是简约的if、else判断,比如:
    if(num%3==0 && num%5==0 && num%7==0)
    ...
    虽然结果没问题、代码也简单,但会有多层判断,if嵌套也是越来越深,所以使用枚举算法可以让书面代码看起来更加的干净。

    1. 先来张图做解释


      拆解图

      将目标数对3、5、7分别取余,能整除记作1,不能整除记作0。然后将对3整除的标记向左移动2位,将对5整除的标记向左移动1位,再把3个标记位相加即可变成上图的二进制标记位,最后将二进制对应成十进制就是我们要找的case。
      比如num=21,21%3=0记作1,21%5=1记作0,21%7=0记作1,那么进行左移和相加计算后,得到二进制数101,对应十进制数5,那么即可走入相应的case。

    2. 接下来上代码

    // Swift版
    func test(_ num: Int) {
        let c1: Int = num%3==0 ? 1 : 0
        let c2: Int = num%5==0 ? 1 : 0
        let c3: Int = num%7==0 ? 1 : 0
        switch (c1<<2) + (c2<<1) + c3 {
            case 0:
                print("均不可被3、5、7整除")
                break
            case 1:
                print("可被7整除")
                break
            case 2:
                print("可被5整除")
                break
            case 3:
                print("可被5、7整除")
                break
            case 4:
                print("可被3整除")
                break
            case 5:
                print("可被3、7整除")
                break
            case 6:
                print("可被3、5整除")
                break
            case 7:
                print("可被3、5、7整除")
                break
                
            default:
                break
        }
    }
    

    另外,不必纠结为啥第一位是对3整除,第二位是对5整除,第三位是对7整除,他们只是标记而已。比如将对3整除和对7整除互换位置也是可以的。当然,底下的case也要将3、7值互换。
    多谢支持!

    相关文章

      网友评论

          本文标题:随记算法题-枚举算法-可被3、5、7整除的数

          本文链接:https://www.haomeiwen.com/subject/lumealtx.html