› Sviluppare funzionalita su Microsoft Office con VBA › Amici … Amici….I Numeri hanno degli Amici "Sfida di Halloween"
-
AutoreArticoli
-
"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 )Sono da telefonino @ oscar fuori strada
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.Ha adesso ho capito era ogni singolo numero da 200 a 1300
vedendo quello di gianfranco ho capito bene
>>> 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-unicociao
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
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.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.
Allego solo i numeri per una verifica 220-284
496 -unico
1184-1210
2620-2924
5020-5564
6232-6368
8128-unicoci sono solo due coppie "Amici"
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 )ciao
l'ho ripostata la formula avevo capito male il meccanismo
per il codice lo lasciamo ai vbaisti
'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 )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-Amici496-496-unico
1210-1184-Amici
1184-1210-AmiciIl 28, 496, 8128 sono "unici" , pertanto non essendo due numeri non possono essere amici. I miei numeri sono giusti?
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
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.

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 SubNel 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 numeriEDIT .........If InStr(MsG2, CStr(X)) = 0 And X <> NuM Then
Questa è la mia versione se qesta volta ho capito bene

Allegati:
You must be logged in to view attached files.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 Subfunction 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 FunctionQuesta è 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.
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
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
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
Penso che l'unico che ha capito sia Raffaele , poi vediamo cosa dice Albatros
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).
-
AutoreArticoli


