» »

[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

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
http://upor.blogec.si
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.

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 :D) rešit.
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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Sortiranje po večih atributih, java

Oddelek: Programiranje
161675 (1441) marjan_h
»

Digitalna evolucija (strani: 1 2 3 426 27 28 29 )

Oddelek: Znanost in tehnologija
141675537 (25706) pietro
»

Pomoc programiranje - Napisite funkcije

Oddelek: Programiranje
102031 (1620) FuI2cY
»

Okrajšan ulomek (C++)

Oddelek: Programiranje
91833 (1648) Ktj
»

[c#]: iz ascx v ascx

Oddelek: Programiranje
9835 (687) nuclear

Več podobnih tem