Algorytm euklidesa

Algorytm euklidesa
ulxoriffh Sdfv
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 2 lata
  • Postów:18
0

Cześć,
Zrobiłem algorytm euklidesa niestety jest on za wolny. Co mogę poprawićw swoim kodzi. Algorytm ma działać dla liczb zerowych . Czyli dla liczb 0 2 ma wyswiatlić dwójkę. Zrobiłem tą funkcję ale mój algorytm jest za wolny.
#include<iostream>
using namespace std;

int main()
{

while (!std::cin.eof()){
	unsigned long long a, b;

	

	cin >> a >> b;
	if (a == 0 || b == 0) {
		cout << "0" << endl;
	}
		 else if (a > 0 && b == 0 )
		{
			cout << "a" << endl;
		}
		 if (b > 0 && a == 0)
	{
		cout << "b";
	}
	
	else {
		while (a != b)
			if (a < b) b -= a; else a -= b;
		cout << a << endl; }
	
	



}
return 0;

}

szweszwe
  • Rejestracja:ponad 11 lat
  • Ostatnio:4 dni
  • Lokalizacja:Kraków
  • Postów:1694
0

No ale źle ci działa ten algorytm. Dla 2 i 0 wypisze ci 0.

_13th_Dragon
nie, wypisze: a <- źle, czytaj niżej.
szweszwe
Przecież załapie się na pierwszy if.
_13th_Dragon
Ups, racja, nie zobaczyłem dokładnie i przyjąłem że tam stoi sensowny operand, czyli: &&
szweszwe
No nie, w tym kodzie niewiele jest sensownego :)
TomaszLiMoon
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 11 godzin
  • Postów:530
0

Można to zakodować prościej, używając algorytmu rekurencyjnego.

Kopiuj
int gcd(int a, int b)
{
    return (a==0)?b:gcd(b%a,a);
}

Jego złożoność jest rzędu O( Log(min(a, b)) ).

edytowany 1x, ostatnio: TomaszLiMoon
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:4 minuty
  • Postów:4924
0

Trochę Żeś namieszał, prościej to zrobić w funkcji:

Kopiuj
using ull = unsigned long long int;

ull gcd(ull a, ull b) {
	ull m;
	while (0 != b) {
		m = b;
		b = a % b;
		a = m;
	}
	return a;
}

ulxoriffh Sdfv
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 2 lata
  • Postów:18
0

Na zajęciach jeszcze nie mieliśmy funkcji. Próbowałem tak zrobić ale czas wykonywania był dłuższy. Zmieniłem trochę algorytm. Teraz brakuje mi jednej setnej sekundy do zalicznia zadnia. Może wiecie jak to zoptymalizować przy uzuciu podstawowych operacji w c++.

#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
while (!std::cin.eof())
{
unsigned long long a, b;
cin >> a >> b;
if (a == 0) {
cout <<b << endl;
}
if (b == 0)
{
cout <<a << endl;
}
else {
while (a != b)
if (a < b) b -= a; else a -= b;
cout << a << endl;
}

	}
}
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:4 minuty
  • Postów:4924
0

Mogleś przepisać tą funkcję do maina:

Kopiuj
int main(int argc, char **argv)
{
	while (!std::cin.eof()){
		unsigned long long a, b;
		cin >> a >> b;
		unsigned long long m;
		while (b != 0){
			m = b;
			b = a % b;
			a = m;
		}
		cout << a << endl;
	}
	return 0;
}

Jak teraz nie przejdzie, to wydaje mi się, że ciężko będzie poprawić złożoność.


edytowany 1x, ostatnio: lion137
Shalom
Ale można pozbyć się wolnego cin/cout ;)
_13th_Dragon
std::cin.eof() oraz cin >> a >> b - coś tu nie pasuję
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0
Kopiuj
int main()
{
   for(unsigned long long a,b;cin>>a>>b;cout<<a<<endl) for(unsigned long long r;b;r=a%b,a=b,b=r) {}
   return 0;
}

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:3 minuty
2
ulxoriffh Sdfv napisał(a):

Na zajęciach jeszcze nie mieliśmy funkcji.

To znaczy, że nauczyciel nie ma pojęcia o kodowaniu.
Używanie i definiowanie funkcji jest chyba najistotniejszą funkcjonalnością każdego języka programowania.
IMO zaraz po wypisaniu "hello word" powinno się uczyć definiowania funkcji (jeszcze przed for if itp).

A już na pewno nie powinno się zadawać zadań do rozwiązania, jeśli ktoś jeszcze nie umie definiować funkcji.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
lion137
Właśnie, algorytm, bardzo prosty, ale nie banalny, a tu funkcji nie znamy!
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:4 dni
  • Postów:3277
0

Podstawowy problem z punktu widzenia wydajności, to niezauważenie, że zamiast wielokrotnego odejmowania lepiej użyć reszty z dzielenia (a%b).

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.