裏 RjpWiki

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

最寄りの素数

2016年02月26日 | ブログラミング

締め切りが 2月26日(金)10:00 AM なので,
2月26日(金)10:01 AM に公開されるように,自動投稿

それにしても,締め切りまで長いわ~~

最寄りの素数
【概要】
下図のように、1以上のすべての整数をならべます。
入力で指定された数に最も近い素数を求めてください。

【入力と出力】
入力は
14
のような形で、標準入力から来ます。
普通に10進数です。素数が来ることはありません。
出力は、入力の最寄りの素数です。
最寄りの素数が複数ある場合は、小さい順にコンマ区切りで出力してください。
入力が14のときの出力は
7,13,23
になります。


ブルートフォースで何とかなる。

f = function(n=1000000, range=7) {
   k = floor(sqrt(n)-1e-10)+1
   mx <- (k+range)^2
   tbl <- 1:mx
   tbl[1] <- 0
   for (i in 2:floor(sqrt(mx))) {
      if (tbl[i]) {
         mx2 <- mx %/% i
         tbl[2:mx2*i] <- 0
      }
   }
   mid = k^2-k+1
   nx = ifelse(n > mid, k^2-n+1, k)
   ny = ifelse(n > mid, k, n-(k^2-2*k+2)+1)
   Min = .Machine$integer.max
   M = D2 = NULL
   for (k2 in k+(-range:range)) {
      mid = k2^2-k2+1
      for (m in max(1, k2^2-2*k2+2):max(1, k2^2)) {
         if (tbl[m]) {
            mx = ifelse(m > mid, k2^2-m+1, k2)
            my = ifelse(m > mid, k2, m-(k2^2-2*k2+2)+1)
            d2 = (nx-mx)^2+(ny-my)^2
            if (Min >= d2) {
               Min = d2
               M = c(M, m)
               D2 = c(D2, d2)
            }
         }   
      }
   }
   cat(M[D2 == Min], sep=",")
}
con = file("stdin", "r"); f(as.integer(readLines(con, 1)))

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村