裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

実力判定:Aランク

2017年12月31日 | ブログラミング

実力判定:Aランク

締め切りが 2017/12/31 10:00 AM なので,その 1 分後に投稿されるように予約

【問題】
1から1,000,000までの整数の範囲で、連続する2値を合計します。
2値の合計が、整数Nの倍数になる組み合わせを、数えてください。
ただし、整数Nは、2≦N≦1,000 の範囲とします。


整数Nが11の場合、「5, 6(合計は11)」、「16,17(合計は33)」……という組み合わせが、整数Nの倍数になります。
また、連続する2値の最小は「1, 2(合計は3)」、最大は、「999999, 1000000(合計は1999999)」になります。

【入力】
標準入力から、複数行のデータが与えられます。1行のデータが、1つの整数Nになります。

【出力】
1行ずつ処理を行ない、その答えを1行ごと標準出力に出力します。

【入出力サンプル】
Input
307
456
545
165

Output
3257
0
1835
6061

=======================

1000行のテストデータがあるんだけど,その中に同じ値が複数個ある。
テストデータの準備としては,漫然としており,だらしない。

期待される結果と違うといわれたのであるが,テストデータがあまりにも多いので,どれが間違えているのか(あるいは,プログラムに不備があるのか)なかなかわからなかった。
結果としては,答えが 200000 となる場合に R では 2e+5 と出力されることがあるのが原因であった(options(scipen=100) とでもしておけばよいのだが)。

f = function(N) {
    invisible(sapply(N, function(n) {
        if (n %% 2 == 0) {
            m = 0
        } else {
            m = (1999999 %/% n + 1) %/% 2
        }
        options(scipen=100)
        cat(m, "\n", sep="")
    }))
}
f(scan(file("stdin", "r")))

より簡単に書くとこうなる。

f = function(N) {
    options(scipen=100)
    cat((ifelse(N %% 2, 1999999, 0) %/% N + 1) %/% 2, sep="\n")
}
f(scan(file("stdin", "r")))

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 切手の選び方は何通り? | トップ | カエル跳びゲームを一般化して! »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事