Sviluppare funzionalita su Microsoft Office con VBA Amici … Amici….I Numeri hanno degli Amici "Sfida di Halloween"

Login Registrati
Stai vedendo 25 articoli - dal 1 a 25 (di 36 totali)
  • Autore
    Articoli
  • #50070 Score: 0 | Risposta

    albatros54
    Moderatore
      89 pts

      "Per l’uomo, quello di amicizia è un sentimento antico e
      fondamentale che si concretizza nell'avere amici. Ma cosa è
      un amico? Pare che alla domanda, Pitagora, rispondesse: « uno
      che sia l'altro io, come sono 220 e 284 ». Perché 220 è "l'altro
      io ” di 284 e viceversa?
      Il numero 220 ha per divisoni (escludendo il numero stesso):
      1, 2, 4, S, 10, 11, 20, 22, 44, 55, 110.
      Sono undici i divisori e la loro somma è proprio 284. E
      il numero 284? I suoi diviso-ri (escludendo sempre il numero
      stesso) sono solo 5:
      1, 2, 4, 71, 142
      ma la loro somma è proprio 220.
      C'è certo molto di simpatico e di attraente in questo: i
      numeri 220 e 284 sono diversi e diversi sono i loro divisori,
      eppure...sono Amici"

      Si chiede  di trovare i Numeri  Amici in un Range(200 to 1300), mi limito sul Range per non impallare il computer, perchè con questo range il mio impiega alcuni minuti.Si chiede di:

      A: nella colonna A di un foglio i numeit del range

      B: nella colonna B i divisori del numero

      C: nella colonna C la somma dei divisori

      D: nella colonna E i Numeri Amici trovati

      Buon Lavoro  

       P.S.Una parte del titolo l'ho rubato  da V.F.  

      Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
      Sempre il mare, uomo libero, amerai!
      ( Charles Baudelaire )
      #50071 Score: 0 | Risposta

      Oscar
      Partecipante
        45 pts

        Ti risultano giusti o ho capito male

        260-325-650

        #50072 Score: 0 | Risposta

        Albatros54

          Sono da telefonino @ oscar fuori strada   

          #50073 Score: 0 | Risposta

          Oscar
          Partecipante
            45 pts

            Allora non ho capito bene però vedi l'immagine

            #50075 Score: 0 | Risposta

            gianfranco55
            Partecipante
              91 pts

              ciao

              con 365

              divisori

              =TESTO.UNISCI("-";VERO;A.RIGA(LET(x;A1/SEQUENZA(1300);y;INT(x);UNICI(SE(x-y;1;y)));3))

              somma escluso il numero

              =SOMMA(A.RIGA(LET(x;A1/SEQUENZA(1300);y;INT(x);UNICI(SE(x-y;1;y)));3);-A1)

              numeri amici

              =SE(C1>1;A.RIGA(FILTRO($A$1:$A$1300;$C$1:$C$1300=SOMMA(LET(x;A1/SEQUENZA(1300);y;INT(x);UNICI(SE(x-y;1;y)));-A1));3);"")

               

              ho escluso i numeri che hanno come divisore 1

               NB

              si può fare anche con formule di versione inferiore

              chiaro che ne va della velocità di calcolo

               

               

              Allegati:
              You must be logged in to view attached files.
              #50078 Score: 0 | Risposta

              Oscar
              Partecipante
                45 pts

                Ha adesso ho capito era ogni singolo numero da 200 a 1300

                vedendo quello di gianfranco  ho capito bene

                #50082 Score: 0 | Risposta

                Raffaele53
                Partecipante
                  23 pts

                  >>> i Numeri Amici trovati
                  Per caso gli "amici" possono essere multipli???

                  Non riesco capire quali siano i numeri "amici" di gianfranco55 per fare un confronto.
                  A me risultano solo 2 numeri sino 1300 ed 5 numeri sino 10.000 (vba= 3minuti)
                  Allego solo i numeri per una verifica
                  220-284
                  496 -unico
                  1184-1210
                  2620-2924
                  5020-5564
                  6232-6368
                  8128-unico

                   

                  #50083 Score: 0 | Risposta

                  gianfranco55
                  Partecipante
                    91 pts

                    ciao

                    io ho capito che i numeri amici

                    sono quelli che hanno la somma dei loro divisori uguale.

                    perciò

                    220 ha come somma dei divisori 284

                    ma anche 

                    562 ha come somma dei divisori 284

                     

                    perciò i numeri amici sono 220 e 562

                    la colonna B ha i divisori

                    la colonna C è la somma

                    dalla colonna E in poi vedi i numeri amici

                    #50084 Score: 0 | Risposta

                    gianfranco55
                    Partecipante
                      91 pts

                      capito che non avevo capito

                      la formula da usare è 

                      =SE(SOMMA(A.RIGA(LET(x;C1/SEQUENZA(1300);y;INT(x);UNICI(SE(x-y;1;y)));3);-C1)=A1;"Amici";"")

                       

                      Allegati:
                      You must be logged in to view attached files.
                      #50088 Score: 0 | Risposta

                      albatros54
                      Moderatore
                        89 pts

                        Buongiorno.

                        Un numero1 è Amico quando prendendo  somma dei suoi divisori e andando a ricercare questo valore tra i Numeri si trova che la somma dei divisori di questo numero corrisponde al Numero1.

                        Raffaele53 ha scritto:

                        Allego solo i numeri per una verifica 220-284
                        496 -unico
                        1184-1210
                        2620-2924
                        5020-5564
                        6232-6368
                        8128-unico

                        ci sono solo due coppie "Amici"

                        gianfranco55 ha scritto:

                        perciò

                        220 ha come somma dei divisori 284

                        ma anche 

                        562 ha come somma dei divisori 284

                        non va bene  

                        P.S.

                        Codice ....Codice non Formule  

                         

                        Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
                        Sempre il mare, uomo libero, amerai!
                        ( Charles Baudelaire )
                        #50089 Score: 0 | Risposta

                        gianfranco55
                        Partecipante
                          91 pts

                          ciao

                          l'ho ripostata la formula  avevo capito male il meccanismo

                          per il codice lo lasciamo ai vbaisti  

                           

                          #50090 Score: 0 | Risposta

                          albatros54
                          Moderatore
                            89 pts

                            gianfranco55 ha scritto:

                            'ho ripostata la formula  avevo capito male il meccanismo

                            per il codice lo lasciamo ai vbaisti

                            si ho visto il file  ma credo che ci siao delle incongruenze  

                             496 di chi è Amico?

                            Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
                            Sempre il mare, uomo libero, amerai!
                            ( Charles Baudelaire )
                            #50091 Score: 0 | Risposta

                            gianfranco55
                            Partecipante
                              91 pts

                              ciao

                              496 è amico di 496

                              ma se vuoi scrivere unico

                              =SE(C1=A1;"unico";SE(SOMMA(A.RIGA(LET(x;C1/SEQUENZA(1300);y;INT(x);UNICI(SE(x-y;1;y)));3);-C1)=A1;"Amici";""))

                              se non lo vuoi

                              =SE(C1=A1;"";SE(SOMMA(A.RIGA(LET(x;C1/SEQUENZA(1300);y;INT(x);UNICI(SE(x-y;1;y)));3);-C1)=A1;"Amici";""))

                              284-220-Amici
                              220-284-Amici

                              496-496-unico
                              1210-1184-Amici
                              1184-1210-Amici

                               

                              #50093 Score: 0 | Risposta

                              Raffaele53
                              Partecipante
                                23 pts

                                Il 28, 496, 8128 sono "unici" , pertanto non essendo due numeri non possono essere amici. I miei numeri sono giusti?

                                #50094 Score: 0 | Risposta

                                gianfranco55
                                Partecipante
                                  91 pts

                                  ciao

                                  si ma visto i numeri che hai messo meglio cambiare le formule così

                                  =SOMMA(A.RIGA(LET(x;A1/SEQUENZA(A1);y;INT(x);UNICI(SE(x-y;1;y)));3);-A1)

                                  nelle formule mettiamo la sequenza uguale al numero da ricercare

                                  =SOMMA(A.RIGA(LET(x;C1/SEQUENZA(C1);y;INT(x);UNICI(SE(x-y;1;y)));3);-C1)

                                   

                                  ti ho ricaricato il file con i tuoi numeri in basso nel post precedente

                                  #50095 Score: 0 | Risposta

                                  scossa
                                  Partecipante
                                    37 pts

                                    Ciao,

                                    non ho capito la colonna D a cosa serva visto che se due numeri sono "amici" (220 e 284) in una riga ci sarà 220 in A e 284 in C e in altra riga ci sarà in A 284 e in C 220.

                                     

                                    #50096 Score: 0 | Risposta

                                    Raffaele53
                                    Partecipante
                                      23 pts
                                      Sub Amici_Amici()
                                      Dim X As Long, Y As Long, Z As Long, NuM As Long, R As Long, MsG As String, MsG2 As String
                                          For X = 200 To 1500
                                              NuM = Evaluate("=SUMPRODUCT((ROW(A1:A" & X & "))*(MOD(" & X & ",ROW(A1:A" & X & "))=0))-" & X & "")
                                              If Evaluate("=SUMPRODUCT((ROW(A1:A" & NuM & "))*(MOD(" & NuM & ",ROW(A1:A" & NuM & "))=0))-" & NuM & "") = X Then
                                                  If InStr(MsG2, CStr(X)) = 0 Then
                                                      R = R + 1
                                                      Cells(R, 1) = X
                                                      MsG = "1,"
                                                      For Y = 2 To X - 1
                                                          If X Mod Y = 0 Then MsG = MsG & Y & ","
                                                      Next Y
                                                      Cells(R, 2) = MsG
                                                      Cells(R, 3) = NuM
                                                      MsG = "1,"
                                                      For Y = 2 To NuM - 1
                                                          If NuM Mod Y = 0 Then MsG = MsG & Y & ","
                                                      Next Y
                                                      Cells(R, 4) = MsG
                                                      MsG2 = MsG2 & " " & X & " = " & NuM & " , "
                                                  End If
                                              End If
                                          Next X
                                      MsgBox "fatto"
                                      End Sub

                                      Nel VBA facendo un ciclo mi sono "inventato" una formula: Ex Numero =284
                                      XXX =MATR.SOMMA.PRODOTTO(RIF.RIGA(A1:A284)*(RESTO(284;RIF.RIGA(A1:A284))=0))-284
                                      XXX = 220. Ora invertendo i valori se risulta =284, saprò se sono amici
                                      =SE(MATR.SOMMA.PRODOTTO(RIF.RIGA(A1:A220)*(RESTO(220;RIF.RIGA(A1:A220))=0))-220=284;"amici"...
                                      Per finire un ciclo su tali numeri

                                      EDIT .........If InStr(MsG2, CStr(X)) = 0 And X <> NuM Then

                                      #50097 Score: 0 | Risposta

                                      Oscar
                                      Partecipante
                                        45 pts

                                        Questa è la mia versione se qesta volta ho capito bene

                                        Allegati:
                                        You must be logged in to view attached files.
                                        #50099 Score: 0 | Risposta

                                        scossa
                                        Partecipante
                                          37 pts

                                          Il codice utilizzato per la tabella al post sopra:

                                          sub AmiciMiei():

                                          Sub AmiciMiei()
                                          'by scossa
                                          'https://www.excelvba.it/forumexcel/forums/discussione/amici-amici-i-numeri-hanno-degli-amici/
                                          
                                            Dim nUT As Double, j As Double, nSigma As Double
                                            Dim nRow As Long
                                            Dim ArrDiv() As Variant, ArrSigma As Variant
                                            Dim sDiv As String
                                            
                                            nUT = 200
                                            nRow = 2
                                            Application.ScreenUpdating = False
                                            For j = nUT To 20000
                                              ArrDiv = fSigmaDiv(j)
                                              sDiv = Join(ArrDiv(1), " ")
                                              nSigma = ArrDiv(0)
                                              ArrSigma = fSigmaDiv(nSigma)(0)
                                              If ArrSigma = j And j <> nSigma Then
                                                Cells(nRow, 1) = j
                                                Cells(nRow, 2) = sDiv
                                                Cells(nRow, 3) = nSigma
                                                nRow = nRow + 1
                                              End If
                                            Next j
                                            Application.ScreenUpdating = True
                                          End Sub

                                          function di servizio fSigmaDiv(ByVal nNum As Double)

                                          Function fSigmaDiv(ByVal nNum As Double) As Variant
                                          'by scossa
                                          'restituisce in un array la somma dei divisori di nNum e l'array dei divisori
                                            Dim j As Double, x As Double, ArrDiv() As String
                                            
                                            If nNum = 0 Then
                                              fSigmaDiv = CVErr(2000) '2042
                                            Else
                                              For j = 1 To nNum - 1
                                                If (nNum Mod j) = 0 Then
                                                  fSigmaDiv = fSigmaDiv + j
                                                  x = x + 1
                                                  ReDim Preserve ArrDiv(1 To x)
                                                  ArrDiv(x) = CStr(j)
                                                End If
                                              Next
                                              fSigmaDiv = Array(fSigmaDiv, ArrDiv)
                                            End If
                                          
                                          End Function
                                          #50100 Score: 0 | Risposta

                                          scossa
                                          Partecipante
                                            37 pts

                                            Oscar ha scritto:

                                            Questa è la mia versione se qesta volta ho capito bene

                                            un po'  troppo semplice così. Secondo me la tabella deve riportare solo i numeri amici e non tutti i numeri da 200  a 1300, altrimenti devi spulciarti tutte le righe confrontandole manualmente per trovare gli unici amici.

                                            #50101 Score: 0 | Risposta

                                            scossa
                                            Partecipante
                                              37 pts

                                              scossa ha scritto:

                                              un po'  troppo semplice così.

                                              Qualora invece avessi capito male io e la tabella dovesse contenere tutti i numeri da 200 a 1300, questa a la nuova versione della sub:

                                              Sub AmiciMieiAll()
                                              'by scossa
                                              'https://www.excelvba.it/forumexcel/forums/discussione/amici-amici-i-numeri-hanno-degli-amici/
                                              
                                                Dim nUT As Double, j As Double, nSigma As Double
                                                Dim nRow As Long
                                                Dim ArrDiv() As Variant, ArrSigma As Variant
                                                Dim sDiv As String
                                                
                                                nUT = 200
                                                nRow = 2
                                                Application.ScreenUpdating = False
                                                For j = nUT To 1300
                                                  DoEvents
                                                  ArrDiv = fSigmaDiv(j)
                                                  sDiv = Join(ArrDiv(1), " ")
                                                  nSigma = ArrDiv(0)
                                                  ArrSigma = fSigmaDiv(nSigma)(0)
                                                  Cells(nRow, 1) = j
                                                  Cells(nRow, 2) = sDiv
                                                  Cells(nRow, 3) = nSigma
                                                  If ArrSigma = j And j <> nSigma Then
                                                    Cells(nRow, 4) = j & " : " & nSigma
                                                  End If
                                                  nRow = nRow + 1
                                                Next j
                                                Application.ScreenUpdating = True
                                              End Sub

                                              #50102 Score: 0 | Risposta

                                              Oscar
                                              Partecipante
                                                45 pts

                                                scossa ha scritto:

                                                un po'  troppo semplice così. Secondo me la tabella deve riportare solo i numeri amici e non tutti i numeri da 200  a 1300, altrimenti devi spulciarti tutte le righe confrontandole manualmente per trovare gli unici amici.

                                                Ciao scossa infatti non ho capito quasi niente, ma ho preso riferimento alla tabella di gianfranco

                                                Se Albatros posterà una tabella corretta vorse capirò meglio cosa cercare

                                                #50106 Score: 0 | Risposta

                                                gianfranco55
                                                Partecipante
                                                  91 pts

                                                  ciao Scossa

                                                  la colonna D non serve a niente

                                                  l'ho aggiunta all'originale per mostrare il funzionamento

                                                  della formula in E  e dimostrare che il risultato è esatto

                                                  #50107 Score: 0 | Risposta

                                                  Oscar
                                                  Partecipante
                                                    45 pts

                                                    Penso che l'unico che ha capito sia Raffaele , poi vediamo cosa dice Albatros

                                                    #50110 Score: 0 | Risposta

                                                    scossa
                                                    Partecipante
                                                      37 pts

                                                      Oscar ha scritto:

                                                      Penso che l'unico che ha capito sia Raffaele 

                                                      non mi pare che le colonne di output corrispondano a quanto richiesto, ma questo è relativo; ma 496 non ha amici (in quanto uguale solo a se stesso).

                                                    Login Registrati
                                                    Stai vedendo 25 articoli - dal 1 a 25 (di 36 totali)
                                                    Rispondi a: Amici … Amici….I Numeri hanno degli Amici "Sfida di Halloween"
                                                    Gli allegati sono permessi solo ad utenti REGISTRATI
                                                    Le tue informazioni: