Pozdravljeni,
Prosila bi vas za pomoč pr nasledni nalogi!
Napiši funkcijo razcepi, ki razcepi dano število na praštevila in rezultat vrne kot niz.
Primer: 107800 mora vrniti 2^3 * 5^2 * 7^2 * 11
Lp, Missy.
Razcep na praštevila
Pozdravljeni,
Najprej morate napisati algoritem, ki vam bo podano število razbil na praštevila, nato pa morate ta praštevila še lepo oblikovati na izhodu.
Najprej torej napišite algoritem, ki vam za poljubno število izpiše vsa praštevila, ki ga delijo. Sam algoritem pa je skrajno preprost.
1. Vzamite število in ga v zanki poskusite deliti z vsemi števili med 2 in njegovim korenom (dlje ni potrebno iti... Zakaj? Malce matematike...).
2. Če najdete število, ki deli originalno število, ga izpišite (to je prvi faktor). Nato vzamite ostanek in ponovite točko 1
Primer:
Podano število je 15.
1. 15/2 ni celo število; 15/3=5 ==> izpišem 3 in si zapomnim 5
2. 5/2 ni celo število; 5/3 ni celo število; 5/4 ni celo število; 5/5=1 ==> izpišemo 5 in končamo.
Izpisali smo 3 in 5, kar je rešitev.
Algoritem se sevda da zelo zelo izboljšati, saj pravzaprav ni potrebno deliti z vsemi števili med N in koren(N) temveč samo z praštevili, ki so tu vmes (in teh je mnogo mnogo manj)... A kakorkoli, za vaš problem, je ta algoritem dovolj dober.
Zapišite ga in potem bova nadaljevala.
Najprej morate napisati algoritem, ki vam bo podano število razbil na praštevila, nato pa morate ta praštevila še lepo oblikovati na izhodu.
Najprej torej napišite algoritem, ki vam za poljubno število izpiše vsa praštevila, ki ga delijo. Sam algoritem pa je skrajno preprost.
1. Vzamite število in ga v zanki poskusite deliti z vsemi števili med 2 in njegovim korenom (dlje ni potrebno iti... Zakaj? Malce matematike...).
2. Če najdete število, ki deli originalno število, ga izpišite (to je prvi faktor). Nato vzamite ostanek in ponovite točko 1
Primer:
Podano število je 15.
1. 15/2 ni celo število; 15/3=5 ==> izpišem 3 in si zapomnim 5
2. 5/2 ni celo število; 5/3 ni celo število; 5/4 ni celo število; 5/5=1 ==> izpišemo 5 in končamo.
Izpisali smo 3 in 5, kar je rešitev.
Algoritem se sevda da zelo zelo izboljšati, saj pravzaprav ni potrebno deliti z vsemi števili med N in koren(N) temveč samo z praštevili, ki so tu vmes (in teh je mnogo mnogo manj)... A kakorkoli, za vaš problem, je ta algoritem dovolj dober.
Zapišite ga in potem bova nadaljevala.
lp,
Matjaž Prtenjak
Administrator
Matjaž Prtenjak
Administrator
Pozdravljeni,
mi lahko pogledate kje v kodi imam napako, ker mi ne pravilno izpisuje, tko da je možno, da mi tudi nepravilno izračunava, čeprav se mi zdi, da pri nižjh številih dela ok!?
Hvala, missy.
mi lahko pogledate kje v kodi imam napako, ker mi ne pravilno izpisuje, tko da je možno, da mi tudi nepravilno izračunava, čeprav se mi zdi, da pri nižjh številih dela ok!?
Koda: Izberi vse
Sub prastevilo()
j = 107800
num = 0
i = 2
izpis = ""
While i <= Sqr(j)
If (j Mod i = 0) Then
j = j / i
num = num + 1
delitelj = i
Else
If (num <> 0) Then
If (izpis <> "") Then
izpis = izpis & " * " & delitelj & "^" & num
Else
izpis = izpis & delitelj & "^" & num
End If
End If
i = i + 1
num = 0
End If
Wend
MsgBox (izpis & "*" & j)
End Sub
Hm...
Od kot pa ste vi pobrli to kodo??? Ta koda nima popolnoma nobene zveze z algoritmom, ki sem vam ga opisal. Spodaj vam prilagam kodo, ki ustreza algoritmu, ki sem vam ga opisal in vam izpiše vse deljitelje podanega števila. Proučite kodo in če kaj ne razumete vprašajte.
Za drugi del naloge pa se potrudite sami.
Od kot pa ste vi pobrli to kodo??? Ta koda nima popolnoma nobene zveze z algoritmom, ki sem vam ga opisal. Spodaj vam prilagam kodo, ki ustreza algoritmu, ki sem vam ga opisal in vam izpiše vse deljitelje podanega števila. Proučite kodo in če kaj ne razumete vprašajte.
Koda: Izberi vse
Option Explicit
Sub NajdiDeljitelja(stevilo As Long)
Dim stevec As Long
For stevec = 2 To Sqr(stevilo)
If (stevilo Mod stevec = 0) Then
Debug.Print stevec
NajdiDeljitelja stevilo / stevec
Exit Sub
End If
Next
Debug.Print stevilo
End Sub
lp,
Matjaž Prtenjak
Administrator
Matjaž Prtenjak
Administrator
Zdravo,
predstavlja matematično operacijo deljenja in
pač predstavlja klic funkcije, ki ji podamo rezultat deljenja. V "človeškem jeziku pa to pomeni, da spet (rekurzivno!) kličemo isto funkcijo ampak na ostanku. Če bi gledali klice funkcij bi to izgledalo takole:
Glede na zapisano, funkcije niste ravno razumeli
Poglejte si rekurzivne funkcije!
Koda: Izberi vse
stevilo/stevec
Koda: Izberi vse
NajdiDeljitelja stevilo / stevec
Koda: Izberi vse
NajdiDeljitelja 53130
--> Izpiše 2 in kliče funkcijo: NajdiDeljitelja 53130/2
--> NajdiDeljitelja 26565
----> Izpiše 3 in kliče funkcijo: NajdiDeljitelja 26565/3
----> NajdiDeljitelja 8855
------> Izpiše 5 in kliče funkcijo: NajdiDeljitelja 8855/5
------> NajdiDeljitelja 1771
--------> Izpiše 7 in kliče funkcijo: NajdiDeljitelja 1771/7
--------> NajdiDeljitelja 253
----------> Izpiše 11 in kliče funkcijo: NajdiDeljitelja 253/11
----------> NajdiDeljitelja 23
------------> Izpiše 23, ker je praštevilo.
Če pogledava, kaj vse je izpisal, dobiva:
2
3
5
7
11
23
Poglejte si rekurzivne funkcije!
lp,
Matjaž Prtenjak
Administrator
Matjaž Prtenjak
Administrator