CINQUE

Un problemino di programmazione per tutti (e per nessuno)

Il numero, 197, è un primo circolare perché tutte le rotazioni delle cifre: 197,971 e 719, sono essi stessi numeri primi.

Ci sono tredici primi circolari inferiori a 100: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79 e 97.

Quanti numeri primi circolari ci sono sotto il milione?

Questa voce è stata pubblicata in Algoritmi, Aritmetica, Informatica, Matematica, Programmazione e contrassegnata con , , , , , , , , . Contrassegna il permalink.

16 risposte a CINQUE

  1. bobcarr ha detto:

    finchè non vedo codice completo non considero risolto

    • edoardobastianetto ha detto:

      Option Explicit

      Private Sub Form_Load()

      Dim n As Integer

      Dim j As Long
      For j = 2 To 1000000
      If isCircolare(j) Then
      n = n + 1
      Text.Text = Text.Text & j & ” ”
      End If
      Next j

      MsgBox n
      End Sub

      Function isPrimo(x As Long) As Boolean

      isPrimo = True

      Dim i As Integer
      For i = 2 To Int(Sqr(x))
      If x Mod i = 0 Then
      isPrimo = False
      Exit For
      End If
      Next i

      End Function

      Function isCircolare(x As Long) As Boolean

      isCircolare = True

      Dim s As String
      s = Str(x)
      s = Mid(s, 2, Len(s) – 1)

      Dim z As Integer
      If x 2 Then
      For z = 1 To Len(s)
      If ((Val(Mid(s, z, 1)) Mod 2) = 0) Then isCircolare = False
      Next z
      End If

      If isCircolare = False Then Exit Function

      Dim i As Integer
      For i = 1 To Len(s)
      If Not isPrimo(x) Then isCircolare = False
      s = Mid(s, 2, Len(s) – 1) + Mid(s, 1, 1) ‘gira
      x = Val(s)
      Next i

      End Function

      • bobcarr ha detto:

        si penso funzioni però è un pochettino lungo, credo che dovresti mettere uno step 2 nel ciclo principale e inoltre verificare prima se il numero è primo e poi vedere se è circolare, ti risparmieresti parecchi calcoli

        quanto impiega?

  2. bobcarr ha detto:

    in J :

    rot=: 1&|.&.”:”0
    p=: i.&.(p:^:_1) 1e6
    2 + +/ *./ p e.~ rot^:(1+i.5) p #~ *./@(e.&’1379′)@”:”0 p

    istantaneo

  3. bobcarr ha detto:

    una mia versione python: (occhio alle indentazioni)

    from math import *

    def isPrime(x):
    if x==2 or x==3 or x==5 or x==7: return True
    if x%2==0 or x%3==0 or x%5==0 or x%7==0: return False
    fin=int(sqrt(x))
    for y in range(11,fin+1):
    if x%y == 0: return False
    return True

    def rot(a):
    l=[]
    a=str(a)
    for x in range(1,len(a)):
    a=a[1:len(a)]+a[0]
    l.append(int(a))
    return l

    tot = 4 #2,3,5,7
    for x in range(11,1000000,2):
    y=str(x)
    if y.find(‘2’)==-1 and y.find(‘4’)==-1 and y.find(‘5’)==-1 and y.find(‘6’)==-1 and y.find(‘8’)==-1 and y.find(‘0’)==-1:
    if isPrime(int(y)):
    ok=True
    for z in rot(x):
    if not(isPrime(z)):
    ok =False
    break
    if ok: tot=tot+1
    print(tot)

  4. Filippo Bisconcin ha detto:

    mi manca la funzione per determinare le varie rotazioni (ovvero disposizioni senza ripetizione se non sbaglio)

  5. edoardobastianetto ha detto:

    Prima di ciclare, conviene subito controllare se ci sono numeri pari, in questo caso, sicuramente non è circolare perchè prima o poi finisce come ultima cifra e il numero diventa pari quindi non primo.

    • edoardobastianetto ha detto:

      Dim z As Integer
      If x 2 Then
      For z = 1 To Len(s)
      If ((Val(Mid(s, z, 1)) Mod 2) = 0) Then isCircolare = False
      Next z
      End If

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...