[Swift]Baekjun 2004-組合せ0の個数

2855 ワード

質問リンク
大学入試は遠いので、組み合わせが何なのか覚えていません.
  • ここのncrコンビネーション!
  • コンビネーションは工場で構成されているからです.
    以前のfactorial 0の個数を少し変えました!
    入力数がn,mの場合(n>m)
    (n-m)nの5,5^2,5^3...個数を求める
    1から(n-m)までの5,5^2,5^3...数を求めて抜きたい
    しかし、エラーが発生し続けています...
    だから考えてみると、事実0の個数の前提は
    「2はいつも5より大きい」ここで漏れたのは本当ではないかもしれない.
    そこで今回は、2つの数と5つの数を求めて、2つの中でもっと少ないものを印刷することにしました.

    初期プール(残りタイムアウト)

    
    import Foundation
    
    let nums = readLine()!.split(separator: " ").map{Int(String($0))!}
    
    let n = nums[0]
    let m = nums[1]
    
    func get2(_ num: Int) -> Int {
        var count = 0
        
        for i in 1..<num+1 {
            var temp = i
            while temp>0,temp%2==0 {
                count += 1
                temp /= 2
            }
        }
        return count
    }
    
    
    
    func get5(_ num: Int) -> Int {
        var count = 0
        
        for i in 1..<num+1 {
            var temp = i
            while temp>0,temp%5==0 {
                count += 1
                temp /= 5
            }
        }
        
        return count
    }
    
    let a = get2(n) - (get2(m)+get2(n-m))
    let b = get5(n) - (get5(m)+get5(n-m))
    
    print(a>b ? b : a)
    
    
  • テストボックスが正常に開いてタイムアウトしました.
    だからそれぞれ2または5に分かれた値を加算しないで、5,25125...
  • 最終回答

    
    import Foundation
    
    let nums = readLine()!.split(separator: " ").map{Int(String($0))!}
    
    let n = nums[0]
    let m = nums[1]
    
    func get2(_ num: Int) -> Int {
        var count = 0
        var i = 2
        while num >= i {
            count += num/i
            i *= 2
        }
        
        return count
    }
    
    
    
    func get5(_ num: Int) -> Int {
        var count = 0
        var i = 5
        while num >= i {
            count += num/i
            i *= 5
        }
    
        return count
    }
    
    let a = get2(n) - (get2(m)+get2(n-m))
    let b = get5(n) - (get5(m)+get5(n-m))
    
    print(a>b ? b : a)
    
    このように交換すれば通過できます(やれやれ…)