Permalänk
Medlem

Nybörjare i c++

Hej
Jag har precis börjat lära mig programmera i c++ och försöker göra ett litet enkelt program som ska förkorta ett bråk så lång som möjligt. Jag har skrivit följande kod men något är uppenbarligen fel då jag inte får det att fungera.

#include <iostream> using namespace std; int main() { int taljare; int namnare; cin >> taljare; cin >> namnare; int forkorta = taljare; while(namnare%forkorta !=0 && taljare%forkorta !=0){ forkotta = forkotta-1; } cout << taljare/forkorta << endl; cout << namnare/forkorta<< endl; return 0; }

Tanken är att variabeln forkorta ges samma värde som täljaren och så länge som detta ger en rest så förminskar man forkorta med 1 för att få fram största gemensamma devisor, när denna fåtts fram delar man taljare och namnare med forkorta

Permalänk
Medlem

Orkar inte kolla igenom särskilt noga nu, men du använder dig av "forkotta" istället för "forkorta" inne i while-loopen.

Permalänk
Medlem

Oj, har ändrat det men får det fortfarande inte att fungera

Permalänk
Medlem
Skrivet av Alecktos:

Oj, har ändrat det men får det fortfarande inte att fungera

Men vad blir fel då? Går det inte att kompilera? Är din algoritm fel?

Permalänk
Medlem

while(namnare%forkorta !=0 && taljare%forkorta !=0)

ska vara

while(namnare%forkorta !=0 || taljare%forkorta !=0)

Det behöver ju inte vara en rest på båda för att det inte ska gå att förkorta med det talet.

Edit: >_> ok den kommer ju alltid bli delbar med 1. nvm
Förutom detta så kommer svaret bli skumt om det inte finns ett lämpligt tal att förkorta med. Loopen borde avslutas om forkorta är 1. (vill ju inte gärna dela med 0 heller)

Permalänk
Medlem

Någonting med min algoritm är fel. Säg t.ex att jag sätter in 15 som täljare och 12 som nämnare. Då vill jag få svaren 5 och 4. Men istället skrivs 1 och 0 ut, det borde innebära att while-loopen inte fungerar korrekt och att den bara delar direkt eftersom att 15/15 = 1 och 12/15 =0. Så med andra ord borde det vara något med while-loopen som är fel men jag förstår inta vad.

Permalänk
Medlem

Grejen är att din while loop inte kommer att köras så många gånger du vill, eftersom du sätter din variabel forkorta till taljare så kommer du alltid få 0 där och då kommer din loop inte att köras längre.

Jag skulle istället använda mig av en for-loop för att lösa det där.

#include <iostream> using namespace std; int main() { int taljare; int namnare; cin >> taljare; cin >> namnare; for(int forkorta = taljare; forkorta > 1; forkorta--){ if((taljare % forkorta) == 0 && (namnare % forkorta) == 0){ taljare = taljare/forkorta; namnare = namnare/forkorta; } } cout << taljare << endl; cout << namnare<< endl; return 0; }

Detta borde lösa problemet fint.

EDIT:
Jag måste sluta vara så snabb och inte kopiera all kod

Permalänk
Medlem
Skrivet av ser0n:

Grejen är att din while loop inte kommer att köras så många gånger du vill, eftersom du sätter din variabel forkorta till taljare så kommer du alltid få 0 där och då kommer din loop inte att köras längre.

TS lösning är ju helt klart likvärdig (om inte bättre), den innehåller bara ett par småfel. Din lösning kommer att fortsätta även efter att talen delats med sin GCD, och det är fullständigt onödigt.

Permalänk
Medlem

Ja om man ska börja räkna operationer så kommer min lösning vara snäppet sämre, orkade inte riktigt titta så noga men while-loopen var iofs lätt att fixa bara använda || istället för &&

Permalänk
Medlem

Tack!
Det verkar funka efter att jag bytte && till ||. Fattar inte att jag inte hade sett det innan, är ju självklart att det ska räcka med att en av dem !=0 för att while-loopen ska köras.