Forum » Programiranje » [Java] Prafaktorji
[Java] Prafaktorji
Nuke_H2 ::
Živjo,
zanima me kako bi se lotil naloge, ki pravi:
Program na zaslon izpiše skupne prafaktorje dveh vnesenih števil.
Če vpišem števil 12 in 36, mi more izpisat 2,2,3.
Program sem si zamislil nekako takole:
1.poiščem največji skupni delitelj(12);
2.na inetervalu od 1 do 12 poiščem vsa praštevila(2,3,5,7);
3.pogledam katero število je deljivo z 12(2,3)
no tuki pa nastane problem, kako naj program nadaljujem....?
P.S obstaja lažji način?
Hvala za odgovore
LP H2O
zanima me kako bi se lotil naloge, ki pravi:
Program na zaslon izpiše skupne prafaktorje dveh vnesenih števil.
Če vpišem števil 12 in 36, mi more izpisat 2,2,3.
Program sem si zamislil nekako takole:
1.poiščem največji skupni delitelj(12);
2.na inetervalu od 1 do 12 poiščem vsa praštevila(2,3,5,7);
3.pogledam katero število je deljivo z 12(2,3)
no tuki pa nastane problem, kako naj program nadaljujem....?
P.S obstaja lažji način?
Hvala za odgovore
LP H2O
bozjak ::
pomoje je (dovolj) enostavno, da poiščeš vse prafaktorje obeh števil in jih primerjaš med sabo ter izpišeš tiste, ki so prafaktorji obeh ... Seveda pa to ni optimalen način, kar se zna poznati pri večjih številih ...
Lp
Lp
http://upor.blogec.si
http://bozjak.deviantart.com
http://bozjak.deviantart.com
darkkk ::
Jah lej, skupni prafaktorji so točno tisti, ki so prafaktorji GCD-ja, in nobeni drugi.
Kar se faktorizacije same tiče, nima smisla iskati praštevil, bolje je, da greš kar v zanki od 2 do GCD/2 in gledaš ali je deljivo in kolikokrat ter to shraniš(v seznam al pa tabelo). Npr: s 4 ali 6 ne bo deljivo, ker boš že prej delil z 2 dokler bo šlo oz. še naprej s 3.
Konkretno
j = 2;
num = 12 = gcd(12,36);
12 % 2 == 0 :=> list.add(2); num /= 2;
6 % 2 == 0 :=> list.add(2); num /= 2;
3 % 2 == 1 :=> j++;
3 % 3(j) == 0; :=> list.add(3); num /= 3;
num == 1 :=> stop;
Na koncu samo še izpišeš list in je. Vse skupi delaš v zanki od j = 2 do vključno GCD/2 (shrani da ne računa na vsakem koraku), breakaš zanko če prideš do 1 prej kot j zraste do GCD/2.
Kar se faktorizacije same tiče, nima smisla iskati praštevil, bolje je, da greš kar v zanki od 2 do GCD/2 in gledaš ali je deljivo in kolikokrat ter to shraniš(v seznam al pa tabelo). Npr: s 4 ali 6 ne bo deljivo, ker boš že prej delil z 2 dokler bo šlo oz. še naprej s 3.
Konkretno
j = 2;
num = 12 = gcd(12,36);
12 % 2 == 0 :=> list.add(2); num /= 2;
6 % 2 == 0 :=> list.add(2); num /= 2;
3 % 2 == 1 :=> j++;
3 % 3(j) == 0; :=> list.add(3); num /= 3;
num == 1 :=> stop;
Na koncu samo še izpišeš list in je. Vse skupi delaš v zanki od j = 2 do vključno GCD/2 (shrani da ne računa na vsakem koraku), breakaš zanko če prideš do 1 prej kot j zraste do GCD/2.
darkkk ::
Evo še c++ ovska koda(v javi mora bit skor isto)
#include <iostream> #include <list> int gcd(int a, int b); int main() { int a; int b; std::cout << "vnesi 1: \n"; std::cin >> a; std::cout << "vnesi 2: \n"; std::cin >> b; int num = gcd(a,b); std::cout <<std::endl; std::cout << "gcd: "<<num << std::endl; std::cout << "prafaktorji: "<<std::endl; //faktorizacija gcd-ja; using std::list; list<int> seznam; int j = 2; int G = num; // malo optimizacije if(!(G % 2)) G /= 2; while(j <= G) { if(num == 1) break; if(num % j == 0) { seznam.push_back(j); num /= j; } else j++; } list<int>::const_iterator it; for(it=seznam.begin(); it!=seznam.end(); ++it) { std::cout << *it << std::endl; // each element on a separate line } return 0; } int gcd(int a, int b) { int t; if (a < b) { t = a; a = b; b = t; } while (b != 0) { t = b; b = a%b; a = t; } return a; }
BlueRunner ::
Kar se faktorizacije same tiče, nima smisla iskati praštevil, bolje je, da greš kar v zanki od 2 do GCD/2 in gledaš ali je deljivo in kolikokrat ter to shraniš(v seznam al pa tabelo).
Zadošča od 2 do sqrt(GCD). Lahko pa se izogneš račnanju korena in ostaneš v celoštevilski matematiki tako, da veš, da kvocient ne more biti manjši od imenovalca pri deljenju - izkoristiš komutativnost množenja.
Koda pa za tiste, ki smo bolj javansko navdihnjeni:
ArrayList<Integer> list = new ArrayList<Integer>(); int gcd = getGCD(a, b); for (int fac = 2, div = gcd; fac < gcd; fac++) { if (0 == div % fac) { list.add(fac); div /= fac; fac = 1; } }
Nuke_H2 ::
Mi je uspelo na bolj osnoven način (samo z zankami ) rešit.
Najlepša hvala za pomoč.
Lp H2O
Najlepša hvala za pomoč.
Lp H2O
darkkk ::
Jah saj tule ni noben delal nič drugače kot z zankami, samo shranjevali smo rezultat v list. Lahko pa samo izpisuješ :P
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Sortiranje po večih atributih, javaOddelek: Programiranje | 1667 (1433) | marjan_h |
» | Digitalna evolucija (strani: 1 2 3 4 … 26 27 28 29 )Oddelek: Znanost in tehnologija | 75415 (25584) | pietro |
» | Pomoc programiranje - Napisite funkcijeOddelek: Programiranje | 2025 (1614) | FuI2cY |
» | Okrajšan ulomek (C++)Oddelek: Programiranje | 1824 (1639) | Ktj |
» | [c#]: iz ascx v ascxOddelek: Programiranje | 831 (683) | nuclear |