Proiectul Euler 35: primele circulare sub un milion

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

Acest cod reutilizează funcția care elimină toate cifrele pentru un număr, prezentată în Euler Problema 30. Soluția pentru această problemă utilizează și is.prime Funcție pentru a testa dacă un număr este un prim, dezvoltat pentru Euler Problema 7.

Următoarele funcții auxiliare ajută la rezolvarea problemei:

  • esieve: Generați prime
  • is_prime: Verifică dacă un număr este prim
  • rotate_left: Rotește un număr

  # Sieve of Eratosthenes
  esieve <- function(x) {
    if (x == 1) return(NULL)
    if (x == 2) return(n)
    l <- 2:x
    i <- 1
    p <- 2
    while (p^2 <= x) {
      l <- l(l == p | l %% p!= 0)
      i <- i + 1
      p <- l(i)
    }
    return(l)
  }

  ## Check if a number is prime
  is_prime <- function(x) {
    if (x <= 1) return(FALSE)
    if (x == 2 | x == 3) return(TRUE)
    primes <- esieve(ceiling(sqrt(x)))
    return(all(x %% primes != 0))
  }

  ## Rotate a number to the left
  rotate_left <- function(x) {
    if (x <= 9) return(x)
    i <- 1
    y <- vector()
    while(x >= 1) {
      d <- x %% 10
      y(i) <- d
      i <- i + 1
      x = x %/% 10
    }
    as.numeric(paste(y(c((length(y) - 1):1, length(y))), collapse = ""))
  }

  ## Check circularity
  is_circular_prime <- function(x) {
    n <- trunc(log10(x)) + 1
    p <- vector(length = n)
    for (r in 1:n) {
      p(r) <- is_prime(x)
      x <- rotate_left(x)
    }
    all(p)
  }

  primes <- esieve(1E6)
  length(which(sapply(primes, is_circular_prime)))

Programul principal se desfășoară prin fiecare dintre cele 78.498 de prime sub un milion, își economisește cifrele într -un vector și apoi rulează numerele pentru a testa primalitatea fiecărei rotații.

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.