JavaPaizaでお手軽なオンラインハッカソンのイベントが始まりました。paiza.jp今回は着せ替えソシャゲ風の企画で、アンドロイドの杏ちゃんに着せ替えができるようです。着せ替えアイテムはコードを書いて問題に正解するとアンロックされていくようです。現れたれアンドロイドの彼女の杏ちゃん。貧xなのが気になります。なんと着せ替えに水着!なんとアンロックするアイテムに水着がありました!大興奮です。イベントに参加の紳士の皆さんにも正直なようで大人気です!この水着問題、今回のアイテムの中、難易度が一番高いみたいです。個人的にはメガネがやや「?」でしたが...水着列のゴールド枠(SR枠?)は他よりやや難しくできているようです。逆に上の3段の青枠(N枠?)は消化試合感が否めません。やりました!格闘する事30分!とうとう手に入れました!!!(2回ほどNGを食らいましたがなんとか合格です。考え方コーディングの順に自分がどうやったのか紹介したいと思います。何はともあれ、問題を知らないと回答できないのでまず、仕様を確認します。SEの書いた仕様書読むのは苦痛なのにこういうのは楽しいですね!!!何やら階乗の説明から始まりました。階乗に関する問題の様です。計算結果の数値がすぐに巨大な数になる系の予感がします。今回コードをJavaで書いていますが、JavaにはBigDecimal型という物凄い桁の大きい数字を取り扱えるクラスがあります。残念ながら今回素直に計算すると最大値の「1000000の階乗」を計算すると、恐らく計算はできるのでしょうが時間が相当かかり6秒のタイムリミットを超過してしまうと思われます。今回Javaでコードを記述していますが、c#のBigDecimal型が使えず、JavaのBigInteger使えばいいじゃん!的な発想でJavaを選択しています。結局long型までしかつかってないので言語選択から間違えている感じです。別にc#で書き直せばいいだけの話ですが...階乗のおさらいで、ちょっとしつこいですが、30の階乗までの計算結果を掲載します。265252859812191058636308480000000計算が進むと急激に増加するので真面目に計算しようとしてはいけません。見ると途中から下位の桁にゼロが増加している傾向が見えます。最初の仕様で「最下位の桁のゼロは無視する」とあるので『前の値と今回の数値をかけた後に下位の桁がゼロならゼロを削除する』とできそうです。24」=「120」となった場合、ゼロを削除して「12」と扱えそうです。今回上記のゼロ削除した結果が「9桁以上ならそれより上位の桁は無視する」とあるので計算した結果9桁を超えた場合、上位の桁を削除します。上位桁を削除して「307674368」と扱えそうです。これを入力値N回分の階乗計算の途中に組み込めば問題が解けそうです。コーディング解説は上記考え方とコメントの通りです。補足:9桁最大値がintを超えてしまうのでuintかlongで計算しましょう。あと、途中で11桁で計算していますが、longにする前にintでやっていて計算が合わなくなる現象を回避しようと試みた形跡なのであまり深く考えないでください。len));}}これで安心して水着を着せられますね。普段Javaなんて一切使わないので手が忘れていますね。標準のライブラリのAPIをc#ほどうまく使えてません。プリミティブ型とラップ型も忘れかけています。使わないと忘れますね...やばいです。そのせいか、頭が弱いのかはっきりさせたくないですが、9桁より大きい数値を削除する関数で一度文字列に直して切り取って数値に直しているため、処理が無駄に走っている感があります。Codeでコードを書いていましたがかなり使えます。実行環境はPaiza.ioで走らせていました。追記めがね版も書いてみました。takachan.hatenablog.comサンタコス版も書いてみました。»Profile受託ソフト会社員でWin系業務屋。趣味でCocos2d-x/C++を触っています。etc...主に受託・開発ネタ、Windowsの事、Srellaris、ゲーム制作の進捗の事を喋ります。レイヤーに対してリアルタイムにブラーをかけるスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。