Newsgroup: it.comp.lang.visual-basic
Titolo: Scomporre una frazione

Ho la necessità di scomporre una frazione:
Ad esempio:             690/60
divido x 2/3/5 ottengo: 23/2
X l'algoritmo in VB ho fatto in questo modo:
Prendi il numero + basso tra numeratore e denominatore,
(nell'esempio è 60).
Trovami il 1° numero-primo e dividilo.
Se il risultato è intero dividi anche il numeratore
Se il risultato è intero allora:
NouvaFrazione= 345/30
ecc ecc .......
----------------------------------------------------
Per recuperare tempo faccio:
AAA = INT(690/60) = 11
NEWnumeratore = 690 - ( AAA * 60) = 30
NouvaFrazione= 11 + 30 / 60
FrazioneDAscomporre 30/60 = 1/2
NouvaFrazione = 11+1/2
----------------------------------------------------
X numeri molto grandi il tempo di impiegato x la scomposizione è troppo.
Qualcuno ha un'idea migliore x ridurre due numeri, primi fra loro.
GRAZIE
orf...@tin.it

Ciao,
quattro textbox e un pulsante, in text1 e text2 i valori della frazione
originale e i risultati in text3 e text4, poi e' da ottimizzare:
Option Explicit
    Dim Incrementa As Long
    Dim R1() As Long
    Dim R2() As Long
    Dim R3() As Long
Private Sub Command1_Click()
    Dim Val1 As Long
    Dim Val2 As Long
    Dim Risposta As Long
    Dim Min As Long
    Dim N As Integer
    Dim Y As Integer
    Dim Z As Integer
    Dim S As Integer
    Dim T As Integer
    Val1 = Val(Text1)
    Val2 = Val(Text2)
    Incrementa = 1
    Risposta = Val1
    ReDim R1(0)
    N = 0
    Do While Risposta <> 0
        Risposta = Dividi(Val1)
        If Risposta = 0 Then Exit Do
        R1(N) = Risposta
        Val1 = Val1 \ Risposta
        N = N + 1
        ReDim Preserve R1(N)
    Loop
    Incrementa = 1
    Risposta = Val2
    ReDim R2(0)
    N = 0
    Do While Risposta <> 0
        Risposta = Dividi(Val2)
        If Risposta = 0 Then Exit Do
        R2(N) = Risposta
        Val2 = Val2 \ Risposta
        N = N + 1
        ReDim Preserve R2(N)
    Loop
    S = UBound(R1) - 1
    T = UBound(R2) - 1
    ReDim R3(0)
    N = 0
    For Y = 0 To S
        For Z = 0 To T
            If R1(Y) = R2(Z) Then
                R3(N) = R1(Y)
                R2(Z) = 0
                N = N + 1
                ReDim Preserve R3(N)
                Exit For
            End If
        Next Z
    Next Y
    Min = 1
    For Z = 0 To N - 1
        Min = Min * R3(Z)
    Next Z
    Text3 = Val(Text1) / Min
    Text4 = Val(Text2) / Min
End Sub
Function Dividi(Valore As Long) As Long
    Dim Resto As Long
    If Incrementa > 1 Then Incrementa = Incrementa - 1
    Dividi = 0
    Do While Dividi = 0
        Incrementa = Incrementa + 1
        Resto = Valore Mod Incrementa
        If Incrementa > Valore Then Exit Function
        If Resto = 0 Then Dividi = Incrementa
    Loop
End Function
non mi sembra ci impieghi molto, ma e' tutto molto relativo
beppe
-----------------------------------------------------------
Visita il sito del WWF AltoFerrarese
http://www.comune.cento.fe.it/wwfaf
-----------------------------------------------------------

luckydor:
  ti mando due routines che sono apparse qualche tempo fa'
sull' NG.
Nella routine Semplifica(N1, N2) entri con numeratore e
denominatore della frazione da semplificare (e.g. N1 = 690
N2 = 60) e ottieni di ritorno la semplificazione (e.g. N1 = 23
N2 = 2)
Ciao.
Franco
Private Sub Semplifica(ByRef N1&, ByRef N2&)
'
'
    Dim MCD_N1N2&
'
    MCD_N1N2 = MCD(N1, N2)
'
    N1 = N1 / MCD_N1N2
    N2 = N2 / MCD_N1N2
'
'
'
End Sub
Private Function MCD(ByVal X As Long, ByVal Y As Long) As Long
'
    '***************************
    '* Questa funzione calcola *
    '* il MCD tra due numeri   *
    '***************************
    '® ® ® ® ® ® ® ® ® ® ® ® ® ® ® ® ®
    '® Scritta da MAZZARO DIEGO      ®
    '® ® ® ® ® ® ® ® ® ® ® ® ® ® ® ® ®
    '++ Versione 1.0.0 ++
    '++ Ultima modifica: 24/08/1998 ++
'
    Dim R As Double
'
    Do Until Y = 0
        R = X Mod Y
        X = Y
        Y = R
    Loop
    MCD = X
'
'
'
End Function


 
Se ho capito bene per "scomporre" una frazione intendi ridurla ai minimi termini.
Per farlo devi dividere numeratore e denominatore per il loro massimo comun divisore.
Il massimo comun divisore lo puoi calcolare con questa funzione.
Function Mcd(A As Long, B As Long) As Long
   Dim C As Long
   If A < B Then 'Scambio
      C = A
      A = B
      B = C
   End If
   Do
      C = A Mod B
      If C <> 0 Then
         A = B
         B = C
      End If
   Loop While C <> 0
   Mcd = B
End Function
-- 
Samuele Battarra
mail server: 
libero.it
account: battarsa

Franco Languasco ha scritto:

Occhio, MCD scritta qui' funziona solo se X > Y altrimenti vanno scambiati.
