Razcep na praštevila

Pomoč pri izdelavi makrov
Odgovori
missy
Prispevkov: 40
Pridružen: To Apr 11, 2006 7:03 pm

Razcep na praštevila

Odgovor Napisal/-a missy »

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.
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

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.
lp,
Matjaž Prtenjak
Administrator
missy
Prispevkov: 40
Pridružen: To Apr 11, 2006 7:03 pm

Odgovor Napisal/-a missy »

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!?

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
Hvala, missy.
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

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.

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
Za drugi del naloge pa se potrudite sami.
lp,
Matjaž Prtenjak
Administrator
missy
Prispevkov: 40
Pridružen: To Apr 11, 2006 7:03 pm

Odgovor Napisal/-a missy »

Pozdravljeni,

pogledala sem si kodo in mi je razumljiva, razen tega stevka:

NajdiDeljitelj stevilo/stevec


nisem še zasledila takega zapisa in ne vem kako naj ga razumem!


Lp, M.

Hvala.
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Zdravo,

Koda: Izberi vse

stevilo/stevec
predstavlja matematično operacijo deljenja in

Koda: Izberi vse

NajdiDeljitelja stevilo / stevec
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:

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
Glede na zapisano, funkcije niste ravno razumeli :wink:
Poglejte si rekurzivne funkcije!
lp,
Matjaž Prtenjak
Administrator
Odgovori