Bankomat - szybszy algorytm, krótszy kod?

0

Zadanie jest takie, że korzystając z tablicy liczb, dla wejścia które jest daną kwotą złotych, program ma wybrać jak najmniej banknotów i monet do jej wypłacenia. Zawarłem to w sporej ilości ifów, macie inny pomysł na te zadanie?


#include<cstdlib>
#include<iostream>
#include<conio.h>

using namespace std;

int main()
{

	int bank[] = { 200, 100, 50, 20, 10, 5, 2, 1 }, kwota=0, odejmuj=0, licznik=0;
	
	cout << "Podaj kwote: ";
	cin >> kwota;
	cout << endl;

	if (kwota >= 200)
	{
		licznik = 0;
		while (kwota >= 200)
		{
			++licznik;
			kwota -= bank[0];
		}
		
		cout << licznik << "*200"<<endl;
	}
	
	if(kwota >= 100 && kwota<200)
	{
		licznik = 0;
		while (kwota >= 100)
		{
			++licznik;
			kwota -= bank[1];
		}

		cout << licznik << "*100"<<endl;
	}

	if (kwota >= 50 && kwota < 100)
	{
		licznik = 0;
		while (kwota >= 50)
		{
			++licznik;
			kwota -= bank[2];
		}

		cout << licznik << "*50"<<endl;
	}

	if (kwota >= 20 && kwota < 50)
	{
		licznik = 0;
		while (kwota >= 20)
		{
			++licznik;
			kwota -= bank[3];
		}

		cout << licznik << "*20"<<endl;
	}

	if (kwota >= 10 && kwota < 20)
	{
		licznik = 0;
		while (kwota >= 10)
		{
			++licznik;
			kwota -= bank[4];
		}

		cout << licznik << "*10"<<endl;
	}

	if (kwota >= 5 && kwota < 10)
	{
		licznik = 0;
		while (kwota >= 5)
		{
			++licznik;
			kwota -= bank[5];
		}

		cout << licznik << "*5"<<endl;
	}

	if (kwota >= 2 && kwota < 5)
	{
		licznik = 0;
		while (kwota >= 2)
		{
			++licznik;
			kwota -= bank[6];
		}

		cout << licznik << "*2"<<endl;
	}

	if (kwota >= 1 && kwota < 2)
	{
		licznik = 0;
		while (kwota >= 1)
		{
			++licznik;
			kwota -= bank[7];
		}

		cout << licznik << "*1"<<endl;
	}
	_getch();
	return 0;
}
1

W związku z postem niżej ...
Kurka już rozpisuje jak dla kompletnego laika a wciąż nie jasne, zmieniam na swój styl:

#include <iostream>
using namespace std;
 
int main()
  {
   static unsigned bank[]={ 200, 100, 50, 20, 10, 5, 2, 1 };
   unsigned kwota;
   cout<<"Podaj kwote: ";
   cin>>kwota;
   for(unsigned p=0,cnt=0;kwota;kwota-=cnt*bank[p++]) if((cnt=kwota/bank[p])!=0) cout<<cnt<<" * "<<bank[p]<<" + ";
   return 0;
  }
0

@_13th_Dragon -> co jest warunkiem trwania pętli for?

Co to za warunek if(cnt)?

Ponaglam o bardziej mówiące o sobie zmienne:P

0

Programu nie sprawdzałem, ale algorytm jest OK. (dla polskiego systemu nominałów, tj. na 5, na 2 i na 1)

if (kwota >= 200)

Warunek niepotrzebny, jeśli kwota<200 to while się nie wykona.

while (kwota >= 200)
{
    ++licznik;
    kwota -= bank[0];
}

Raz operujesz na stałych (200), drugi raz na jakiejś tablicy do której indeks jest nic nie mówiący.
Albo wywal tę tablicę - albo zrób wyłącznie na tablicy, jak @_13th_Dragon pokazał.

0

@_13th_Dragon, no ok już rozumiem twój tok rozumowania, szkoda, że sam na niego nie wpadłem:P

Mam pytanie ify, są szybsze od pętli, bo jak sprawdzam w Dev C++, dla dużych liczb to mój program szybciej się wykonuje niż twój??

1 użytkowników online, w tym zalogowanych: 0, gości: 1