Miałem napisać funkcję sprawdzającą, czy dwie liczby mają te same dzielniki pierwsze. Czy funkcja poniżej jest ok, czy możaby coś poprawić, żeby szybciej działała?
int a(int m, int n)
{
int i;
for (i=2; i<=m; i++)
{
if(m%i==0)
{
if(n%i!=0) return 0;
else
{
while (m%i==0) m=m/i;
while (n%i==0) n=n/i;
}
}}
if(n>=2) return 0;
else return 1;
}
Litości z tym formatowaniem:
int a(int m, int n)
{
int i;
for (i = 2; i <= m; i++) {
if (m % i == 0) {
if (n % i != 0)
return 0;
else {
while (m % i == 0)
m = m / i;
while (n % i == 0)
n = n / i;
}
}
}
if (n >= 2)
return 0;
else
return 1;
}
Nie wiem czemu uważasz, że to jest dobrze. Już tak linijka jest ewidentnie źle:
if (n % i != 0)
return 0;
rozwiązanie prymitywne:
unsigned mulUniqueFactorizationOf(unsigned x)
{
unsigned result = 1;
if (x % 2 == 0)
{
result = 2;
while (x % 2 == 0) x /= 2;
}
for (unsigned y = 3; x != 1; y += 2) {
if (x % y == 0) {
result *= y;
while (x % y == 0) x /= y;
}
}
return result;
}
bool haveSamePrimeFactors(unsigned a, unsigned b)
{
return mulUniqueFactorizationOf(a) == mulUniqueFactorizationOf(b);
}