せでぃのブログ

ブログ初心者おいどんのどうでもいい愚痴やどうでもいい愚痴やどうでもいいマメ知識などを披露するチラシの裏です。

水着プログラミング

paiza.jp
 競技プログラミングを始めようと思ったら、swift使えるとこ少ないすな。
水着の階乗問題がむずい。桁あふれ前に前と後をなんかの方法で削るんだろうなぁ。数学的になった途端やる気なくなったw

祝合格

f:id:Sediment:20160308004227p:plain
 下のコードで通るには通ったが、納得はいかないなぁ。桁あふれ対策に何億で割るか微調整してる内にテスト通ってしまったのよ。結果、100億で割ることになった。ところが、このコード、3125!の結果は間違ってるし、他の5の乗数の階乗(15625!,390625!あたり)も怪しいっちゃ怪しいし。というか、何億で割るか次第で、計算結果がブレブレなんすよ。特に1000超えたあたりから。

考え方

1.前
 余りで考えるとか。例えば、
1555割る100の余りは55
43255割る100の余りも55
と考えると、下から必要なケタ数×10の割り算の余りを出せばいいのかしら?

2.後
 計算途中で10で割れ切れたら割るとか?


 1と2を同時にやって、計算が狂わないかどうかがよくわからんけど、桁あふれが課題だと検算もできないのが辛い。

出題例
6の階乗、72
10の階乗、36288
15の階乗、307674368
24の階乗、323943936
25の階乗、330985984
38の階乗、742912
125の階乗、713177088
250の階乗、488255488
625の階乗、392150016
1000の階乗、27753472
1500の階乗、490602496
2222の階乗、727527936
3125の階乗、820582912
4000の階乗、802602496
10000の階乗、1579008
15625の階乗、?
99999の階乗、957162496
100000の階乗、957162496
390625の階乗、?
1000000の階乗、58412544

125と625の計算がうまくいかん直してみたら観測範囲内はうまくいってるように見えるけど、case4で弾かれる。今考えてるのはこんな感じ。うーむ、どこの計算狂ってるんだろう。

let MAXNUM :Int = Int(readLine()!)!
var factorialTotal :Double = 1

// 与えられた数字から降順に掛け算してく
for (var i=MAXNUM,n=1;i>=n;i--) {
    factorialTotal = factorialTotal * Double(i)
    
    // 桁あふれ対策
    /* 修正前
    if(integra%10==0){
        // 後ろ削り
        integra=integra/10
    }
    */
    // 後ろ削り
    while (factorialTotal%10==0) {
        factorialTotal=factorialTotal/10
        //isDivided = true
    }
    // 前削り
    factorialTotal = factorialTotal % 10000000000
}
print(UInt(factorialTotal % 1000000000))