• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

skracanie ułamków zwykłych

Object Storage Arubacloud
0 głosów
1,426 wizyt
pytanie zadane 26 maja 2020 w C i C++ przez Ola_00 Nowicjusz (210 p.)

Co zrobić żeby program skracał ułamki? np. po wykonaniu działania 2/10 + 4/10 = 6/10 program skróci ten ułamek do jak najprostszej formy, czyli 3/5

#include <iostream>
using namespace std;

int nwd_odejmowanie (int a, int b)
{
	while (a!=b)
		if (a>b) a-=b;
			else b-=a;
		return a;
}

void dodawanie (int l1, int m1, int l2, int m2)
{
	int nww;

		nww=m1*m2/nwd_odejmowanie(m1, m2);
	cout<<endl;
	cout<<l1<<"/"<<m1<<" + "<<l2<<"/"<<m2<<" = "<<nww/m1*l1<<"/"<<nww<<" + "<<nww/m2*l2<<"/"<<nww<<" = "<<(nww/m1*l1)
	+(nww/m2*l2)<<"/"<<nww;
	cout<<endl;
	return;
}

void odejmowanie (int l1, int m1, int l2, int m2)
{
	int nww;
		nww=m1*m2/nwd_odejmowanie(m1, m2);
	cout<<endl;
	cout<<l1<<"/"<<m1<<" - "<<l2<<"/"<<m2<<" = "<<nww/m1*l1<<"/"<<nww<<" - "<<nww/m2*l2<<"/"<<nww<<" = "<<(nww/m1*l1)
	-(nww/m2*l2)<<"/"<<nww;
	cout<<endl;
	return;
}

void mnozenie (int l1, int m1, int l2, int m2)
{
	cout<<l1<<"/"<<m1<<" x "<<l2<<"/"<<m2<<" = "<<(l1*l2)<<"/"<<(m1*m2);
	cout<<endl;
	return;
}

void dzielenie (int l1, int m1, int l2, int m2)
{
	cout<<l1<<"/"<<m1<<" : "<<l2<<"/"<<m2<<" = "<<(l1*m2)<<"/"<<(m1*l2);
	cout<<endl;
	return;
}


int main()
{
	int l1; int l2; int m1; int m2;
	int dzialanie;
	int kontynuacja;
		
		do
		{
			cout<<"Podaj licznik ";
			cin>>l1;
			cout<<"Podaj mianownik ";
			cin>>m1;
			cout<<"Podaj liczik ";
			cin>>l2;
			cout<<"Podaj mianownik ";
			cin>>m2;
			
			cout<<"Wybierz jakie dzialanie chcesz wykonac: 1-dodawanie, 2-odejmowanie, 3-mnozenie, 4-dzielenie"<<endl;
			cin>>dzialanie;
			
				if (dzialanie==1)
				{
					dodawanie(l1,m1,l2,m2);
					cout<<"Czy chcesz kontunuowac? 1-tak 2-nie";
					cin>>kontynuacja;
					cout<<endl;
				}
			else
				if (dzialanie==2)
				{
					odejmowanie(l1,m1,l2,m2);
					cout<<"Czy chcesz kontunuowac? 1-tak 2-nie";
					cin>>kontynuacja;
					cout<<endl;
				}
			else
				if (dzialanie==3)
				{
					mnozenie(l1,m1,l2,m2);
					cout<<"Czy chcesz kontunuowac? 1-tak 2-nie";
					cin>>kontynuacja;
					cout<<endl;
				}
			else
				if (dzialanie==4)
				{
					dzielenie(l1,m1,l2,m2);
					cout<<"Czy chcesz kontunuowac? 1-tak 2-nie";
					cin>>kontynuacja;
					cout<<endl;
				}
			else
				{
					cout<<endl<<"Wprowadziles zle dzialanie"<<endl;
					cout<<"Czy chcesz kontynuowac? 1-tak 2-nie";
					cin>>kontynuacja;
					cout<<endl;
				}
			
		}
		while (kontynuacja==1);
		
		
}

 

3 odpowiedzi

+1 głos
odpowiedź 26 maja 2020 przez StaszekBryjak Nowicjusz (160 p.)
Tak jak odpowiedź wcześniej najlepiej podzielić przez największy wspólny dzielnik licznik jak i mianownik. Jest do tego wbudowana funkcja __gcd(x, y), która działa w czasie logarytmicznym.
komentarz 26 maja 2020 przez tkz Nałogowiec (42,000 p.)
Jeżeli już jest to funkcja kompilatora, a nie samego języka. W standardzie jest std::gcd
komentarz 26 maja 2020 przez StaszekBryjak Nowicjusz (160 p.)
Jeśli mamy być ściśli to tak. Rzeczywiście tak jest. Jednak chodziło mi oto że niekoniecznie trzeba samemu ją implementować.
0 głosów
odpowiedź 26 maja 2020 przez DeBos123 Nałogowiec (44,950 p.)
Musisz podzielić licznik oraz mianownik przez największy wspólny dzielnik.
komentarz 26 maja 2020 przez Ola_00 Nowicjusz (210 p.)
A w którym miejscu kodu to wpisać?
komentarz 26 maja 2020 przez DeBos123 Nałogowiec (44,950 p.)

Najlepiej nad innymi funkcjami. Owa funkcja może wyglądać np. tak:

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

Możesz zapisać do zmiennej wynik gcd(a,b) gdzie a to jest licznik, a b to jest mianownik i później podzielić licznik oraz mianownik przez największy wspólny dzielnik.

Np. gcd(10,15) zwróci 5 czyli ułamek 10/15 skrócisz dzieląc 10 oraz 15 przez 5 otrzymując finalnie ułamek 2/3.

–1 głos
odpowiedź 26 maja 2020 przez Anahan89 Obywatel (1,270 p.)
Nie lepiej użyć instrukcji switch? Nielepiej operować na ułamkach dziesiętnych?
komentarz 26 maja 2020 przez Ola_00 Nowicjusz (210 p.)
lepiej by było ale takie mam zadanie i niestety nie wiem jak to zrobić
komentarz 26 maja 2020 przez Anahan89 Obywatel (1,270 p.)
A jeżeliby dopisać funkcję która sprawdza wynik( np.6/10) i sprawdzi warunek, czy licznik%2==0 && mianownik % 2==0 i wtedy skróci?

Podobne pytania

0 głosów
1 odpowiedź 247 wizyt
pytanie zadane 21 marca 2020 w Matematyka, fizyka, logika przez Julka_99 Użytkownik (540 p.)
0 głosów
0 odpowiedzi 131 wizyt
0 głosów
2 odpowiedzi 923 wizyt
pytanie zadane 12 września 2017 w Matematyka, fizyka, logika przez maksbu23 Użytkownik (730 p.)

92,552 zapytań

141,399 odpowiedzi

319,534 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...