witaj
w przypadku szukania nww i nwd dla dwoch liczb skorzystac mozna z wydajnych algorytmow starozytnuch grekow np
Function nww1(a As Integer, b As Integer) As Long
Dim pom As Long
Dim iloczyn As Long
iloczyn = a * b
Do While (b)
pom = a Mod b
a = b
b = pom
Loop
nww1 = (iloczyn / a)
End Function
Function nwd1(a As Integer, b As Integer) As Long
Dim iloczyn As Long
iloczyn = a * b
nwd1 = iloczyn / nww1(a, b)
End Function
jesli natomiast badamy wieksza ilosc argumentow to trzeba troszke pokombinowac, zapewne sa na to wydajne algorytmy w necie ale moze taka propozycja Ci wystarczy:
Sub nwd()
Dim ile As Integer, a() As Long, i As Long, j As Long, wynik As Long
Dim czy As Boolean, liczby As String, pom As Variant
'On Error GoTo blad
pom = ((InputBox("podaj ilość liczb, dla których będziesz" & Chr(13) _
& "szukać największego wsólnego dzielnika", , 2)))
'toleruje tylko liczby naturalne
If IsNumeric(pom) And (pom - Int(pom) = 0) Then ile = pom Else GoTo blad
ReDim a(ile - 1)
liczby = ""
For i = 0 To ile - 1
pom = (InputBox("wprowadź " & i + 1 & " liczbę"))
If IsNumeric(pom) And (pom - Int(pom) = 0) Then a(i) = pom Else GoTo blad
liczby = liczby & CStr(a(i)) & ","
Next i
'liczby - sluzy do wyswietenia wartosci w okienku msgbox;pozbywamy sie ostaniego przecinka
liczby = Left(liczby, Len(liczby) - 1)
'domnienanym rozwiazaniem jest 1 ale jak znajdzie wieksza liczbe to podstawia ja za winik
wynik = 1
'zaczyna sprawdzanie od najmniejszej z podanych wartosci , powyzej nie ma co sprawdzac
For i = Application.WorksheetFunction.Min(a) To 2 Step -1
czy = True
For j = 0 To ile - 1
If a(j) Mod i > 0 Then
czy = False
Exit For
End If
Next j
'jesli wartosc czy nie znienila sie z true na false to znaczy ze dana liczba jest
'dzielnikiem bez reszty wszystkich wprowadzonych wartosci
'mozemy teraz wyjsc z glownej petli bo i tak wiekszego dzielnika nie znajdziemy
If czy = True Then
wynik = i
Exit For
End If
Next i
MsgBox "największy wspólny dzielnik liczb:" & Chr(13) & liczby & " to: " & CStr(wynik)
Exit Sub
blad:
MsgBox "wprowadzane wartości muszą być liczbami naturalnymi", vbCritical
End Sub
Sub nww()
Dim ile As Integer, a() As Long, i As Long, j As Long, wynik As Long
Dim czy As Boolean, liczby As String, max As Long, pom As Variant
On Error GoTo blad
pom = (InputBox("podaj ilość liczb, dla których będziesz" & Chr(13) _
& "szukać najmniejszej wsólnej wielokrotności", , 2))
If IsNumeric(pom) And (pom - Int(pom) = 0) Then ile = pom Else GoTo blad
ReDim a(ile - 1)
liczby = ""
For i = 0 To ile - 1
pom = (InputBox("wprowadź " & i + 1 & " liczbę"))
If IsNumeric(pom) And (pom - Int(pom) = 0) Then a(i) = pom Else GoTo blad
liczby = liczby & CStr(a(i)) & ","
Next i
liczby = Left(liczby, Len(liczby) - 1)
'sprawdzanie zaczyna od najwiekszej z prowadzonych wartosci i bada wszyskie jej wielokrotnosci
max = Application.WorksheetFunction.max(a)
i = 1
Do
czy = True
For j = 0 To ile - 1
If max * i Mod a(j) > 0 Then
czy = False
Exit For
End If
Next j
If czy = True Then
wynik = max * i
Exit Do
End If
i = i + 1
Loop
MsgBox "najmniejszy wspólny dzielnik liczb:" & Chr(13) & liczby & " to: " & CStr(wynik)
Exit Sub
blad:
MsgBox "wprowadzane wartości muszą być liczbami naturalnymi", vbCritical
End Sub |