美文网首页
求最大公约数的两种算法与重载

求最大公约数的两种算法与重载

作者: 写啥呢 | 来源:发表于2016-08-12 20:26 被阅读0次

求最大公约数的两种方法(含递归方法)

//  x和y的最大公约数跟 y%x和的公约数是一样的
//  求最大公约数的全局函数
//  Greatest Common Divisor
//func gcb(x: Int, _ y: Int) -> Int {
//    var a = x < y ? x: y
//    while a > 1 {
//        if x % a == 0 && y % a == 0 {
//            return a
//        }
//        a -= 1
//    }
//    return 1
//}


//短除法,欧几里德算法

    /**
    短除法,求两个数的最大公约数
    - parameter x: 参数1
    - parameter y: 参数2
    - returns: 返回最大公约数
    */
func gcb(x: Int, _ y: Int) -> Int {
    if x > y {
        return gcb(y, x)
    }
    else if y % x != 0{
        return gcb(y % x, x)
    }
    else {
        return x
    }
}



面对初始化了的枚举你会如何写代码?

enum Suite: String {
    case Spade = "♠️",Heart = "♥️",Club = "♣️",Dimond = "♦️"
}

///一张牌
class Card {
    var suite: Suite
    var face: Int
    
    init(suite: Suite,face: Int) {
        self.suite = suite
        self.face = face
    }
    
    /**
    初始化方法
     
    */
    
    
    var info: String {
        get {
            var str = suite.rawValue//rawValue原始值
            switch face {
            case 1: str += "A"
            case 11: str += "J"
            case 12: str += "Q"
            case 13: str += "K"
            default : str += "\(face)"
            }
            return str
        }
    }
}

你发现了其中的开火车式的编程方法了吗(观察simplify() normalize()这两个函数吧)


// 短除法(欧几里得算法)
// x和y的最大公约数跟y%x和x的最大公约数是一样的
// Greatest Common Divisor
func gcd(x: Int, _ y: Int) -> Int {
    if x > y {
        return gcd(y, x)
    }
    else if y % x != 0 {
        return gcd(y % x, x)
    }
    else {
        return x
    }
}

class Fraction {
    private var _num: Int
    private var _den: Int
    
    var info: String {
        get {
            return _num == 0 || _den == 1 ? "\(_num)" : "\(_num)/\(_den)"
        }
    }
    
    init(num: Int, den: Int) {
        _num = num
        _den = den
        simplify()
        normalize()
    }
    
    func add(other: Fraction) -> Fraction {
        return Fraction(num: _num * other._den + other._num * _den, den: _den * other._den)
    }
    
    func sub(other: Fraction) -> Fraction {
        return Fraction(num: _num * other._den - other._num * _den, den: _den * other._den)
    }
    
    func mul(other: Fraction) -> Fraction {
        return Fraction(num: _num * other._num, den: _den * other._den)
    }
    
    func div(other: Fraction) -> Fraction {
        return Fraction(num: _num * other._den, den: _den * other._num)
    }
    
    func normalize() -> Fraction {
        if _den < 0 {
            _num = -_num
            _den = -_den
        }
        return self
    }
    
    func simplify() -> Fraction {
        if _num == 0 {
            _den = 1
        }
        else {
            let x = abs(_num)
            let y = abs(_den)
            let g = gcd(x, y)
            _num /= g
            _den /= g
        }
        return self
    }
}

// 运算符重载(为自定义的类型定义运算符)

func +(one: Fraction, two: Fraction) -> Fraction {
    return one.add(two)
}

func -(one: Fraction, two: Fraction) -> Fraction {
    return one.sub(two)
}

func *(one: Fraction, two: Fraction) -> Fraction {
    return one.mul(two)
}

func /(one: Fraction, two: Fraction) -> Fraction {
    return one.div(two)
}

相关文章

  • 求最大公约数的两种算法与重载

    求最大公约数的两种方法(含递归方法) 面对初始化了的枚举你会如何写代码? 你发现了其中的开火车式的编程方法了吗(观...

  • iOS算法总结

    用两种方法交换A和B 求最大公约数 求最小公倍数 模拟栈操作 排序算法 字符串反转

  • 最大公约数&最小公倍数

    相关链接:常见算法:C语言求最小公倍数和最大公约数三种算法解析:求最大公约数的“辗转相除法原理” 简述辗转相处法的...

  • 数论——欧几里得算法

    欧几里得算法 介绍 【欧几里得算法】又名辗转相除法,是求最大公约数的算法。两个整数的最大公约数是能够同时整除它们的...

  • iOS-常见算法

    目录 常见算法 不用中间变量,用两种方法交换A和B的值 求最大公约数 判断质数 字符串逆序输出 排序相关算法 选择...

  • 手写算法题

    算法题 1.不用中间变量,用两种方法交换A和B的值? 2.求最大公约数? 3.模拟栈操作? 4.排序算法?(选择排...

  • 算法拾遗

    1.求最大公约数 欧几里得算法(辗转相除法)方式:用除数与余数反复做除,余数为0时,除数为两者最大公约数证明:gc...

  • 辗转相除法,最大公约数,最小公倍数

    辗转相除法, 又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公约数的算法。 算法描...

  • 求最大公约数

    求最大公约数 摘自《算法》 描述 计算两个非负整数p和q的最大公约数:若q是0,则最大公约数为p。否则,将p除以q...

  • [最大公约数] 欧几里得算法(辗转相除法)

    在数学中,欧几里得算法,又称辗转相除法,是求最大公约数(greatest common divisor)的算法。辗...

网友评论

      本文标题:求最大公约数的两种算法与重载

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