Program do rozkładania na konkretne liczby

0

Witam,

panowie trochę już myśle nad tym tematem, kombinuje ale coś mi to nie wychodzi. Chodzi mi dokładnie o zrobienie programu który od wpisanej liczby będzie odejmował 20 a dalej rozkładał na konkretne liczby. Te liczby to 1,25, 2,5 5, 10, 15, 20, i 25.
Dajmy na to wpisuję liczbę 220. Chciałbym aby program dał wynik 25 25 25 25, jeśli wpiszę np 100 to chciałbym aby dał mi 25 25 15 15.
Na sam koniec dodam ze chcialbym zrobic ten program w formie graficznej

 
#include <iostream>
#include <conio.h>
#include <cstdlib>
 
using namespace std;
double aLiczba1, aLiczba2, aWynik, bWynik;
//a = aKrazek   1,25
//b = bKrazek   2,5
//c = cKrazek   5
//d = dKrazek   10
//e = eKrazek   15
//f = fKrazek   20
//g = gKrazek   25

int main(int argc, char *argv[])
{
    do  
    {
	    cout << "Podaj liczbe:" << endl;
	    cin >> aLiczba1; 
        aWynik = aLiczba1 - 20;;
        cout << "Wynik: " << aWynik << endl;


    }while(aLiczba1 < 10000);
}
0

a dalej rozkładał na konkretne liczby. Te liczby to 1,25, 2,5 5, 10, 15, 20, i 25.

To nie jest do końca jasne; przykładowo liczbę 120 możesz rozłożyć na wiele sposobów:

25 25 25 25
20 20 20 20 20
15 15 15 15 15 15 10
10 10 10 10 10 10 10 10 10 10
i tak dalej

Który z nich jest poprawny i dlaczego?

0

Czemu przy 100 nie 25, 25, 25 i 5?? Szukaj pod rozkład liczby na czynniki pierwsze, tyle że zamiast liczb pierwszych zastosujesz swoje

0

Co do rozkładu na konkretne wersje to odpowiednia dla liczby 120 jest 25 25 25 25. A to dlatego że potrzebuję aby te liczby zawsze były rozpoczynane w rozkladaniu od najwiekszej zdefiniowanej liczby czyli 25. Dlatego też jeśli będziemy mieli np 110 to rozkład wygladal by tak 25 25 20 20. Jesli np mamy liczbę 60 gdzie nie mozemy zazcac od 25 to zaczynamy od 20 czyli 20 20.

Co do rozkladu liczb na czynniki pierwsze to próbowałem jakoś to przerobic ale nie wiem jak za bardzo stworzyć i wykorzystac takową tablicę z danymi liczbami :/

0

Jesli np mamy liczbę 60 gdzie nie mozemy zazcac od 25 to zaczynamy od 20 czyli 20 20.

Dlaczego nie możemy zacząć od 25?
60-20=40
A więc:
25, 15

0

Próbują nauczyć was myśleć, ale kiedy nie ma czym ...

int main()
  {
   unsigned Tb[]={25,20,15,10,5,2,1}, Value;
   for(;cin>>Value;cout<<endl) for(unsigned i=0;Value;++i) for(;Value>=Tb[i];Value-=Tb[i]) cout<<Tb[i]<<' ';
   return 0;
  }
0

No to moze zaczne od poczatku. Chce na zawody w podnoszeniu ciezarow ktore organizuje z kolegami zrobic wlasnie taki programik a pozniej ubrac go graficznie tak aby jakos wygladal.
W kazdym razie mamy do dyspozycji obciązenia 25kg, 20kg i tak dalej jak wymienilem wyzej. Zasada jest taka aby na sztandze bylo jak najmniej kółek obciążenia dlatego tez nie możemy 60kg zakładac krążkami 5kg bo dość ze się nie zmieszcza to jeszcze nie posiadamy tyle kółek.
W dodatku sama sztanga też waży dlatego od ciężaru muszę odjąć 20kg oraz 2,5kg na strone (tyle ważą zaciski więc łącznie 5kg). Dlatego tez program musi tak dobierac obciążenia aby na kazdej stronie obciążenia sie zgadzały.

0

Typowy problem programowania dynamicznego. Dragon (chyba, nie chce mi sie patrzec dokładnie) zrobił to zachłannie (tez bym tak zrobił nie widząc tresci powyżej), ale zachłan tutaj nie zadziała. Poszukaj w google "problem plecakowy", czy tam "wydawanie reszty".

0

to samo co napisał _13th_Dragon tylko trochę czytelniej ( mam nadzieję że się nie obrazi xd )

unsigned tab[] = { 25, 20, 15, 10, 5, 2, 1 };
unsigned int value;

    while( std::cin >> value ) {

        for( unsigned i = 0; value > 0; ++i )
            for( ; value >= tab[i]; value -= tab[i] )
                std::cout<< tab[i] << " ";

        std::cout<<std::endl;
    }

    return 0;

a tak swoja drogą zauważyłem że zawsze wszystko próbujesz zapisać w jak najmniejszej ilości linii kodu a to nie zawsze jest takie fajnie bo myślę że czytelność kodu jest ważniejsza niż te kilka dodatkowych linijek ;)

0

No to odejmujesz podwójnie największą wartość (25), dopóki starczy ci kółek/wielkość "do dołożenia" jest większa od 50 (pasowało by mieć środek ciężkości na środku sztangi czyż nie?). Potem odejmujesz wg tej samej zasady coraz to mniejsze odważniki. Proponował bym zrobić 2 tablice (jedną do obciążników drugą dla ich ciągle dostępnych ilości), lub też tablicę struktur.

0

Racja, ale tak jak pisałem sztanga waży 20kg a na lewą jak i prawą stronę przypada zacisk 2,5kg (łącznie 5kg). Więc konkretnie aby założyć np 100kg musimy założyc 25 25 10 10 2,5 2,5 dlatego tez na prawą stronę musi być kółko 1x25 1x10 1x 2,5 + zacisk i na lewą to samo (Przepraszam ale przedtem zapomniałem o zaciskach)

1

Zachłanny nadal tu pasuje:

int main()
  {
   struct { unsigned weight,count; } Tb[]={{250,8/2},{200,12/2},{150,7/2},{100,11/2},{50,9/2},{25,6/2},{5,30/2}}; // wagę podajemy pomnożoną przez 10 zaś dostępną ilość krążków dzielimy przez 2
   for(unsigned Value;cin>>Value;cout<<(Value?":/":"")<<endl)
     {
      Value=(Value-25)*5;
      for(unsigned i=0;(Value)&&(i<sizeof(Tb)/sizeof(*Tb));++i)
        {
         for(unsignd k=0;(k<Tb[i].count)&&(Value>=Tb[i].weight);Value-=Tb[i].weight,++k) cout<<Tb[i].weight/10.<<' '<<Tb[i].weight/10.<<' ';
        }
     }
   return 0;
  }
0

Dziękuje wszystkim za pomoc, zrobiłem takie coś przerabiając "wydanie reszty". Ale jest problem, program gryzie sie z liczbami 1,25 oraz 2,5. W dodatku po wpisaniu liczby np 227,5 program zaczyna spamowac.
To samo dzieje sie w programiku Dragona

 
#include <iostream>
#include <stdlib.h>
 
using namespace std;
int aWynik, bWynik; 
int main(int argc, char *argv[])
{
    char key = 1;
    do
    {
        //tablica dostepnych nominalow
        int N[8]={25, 20, 15, 10, 5, 2.5, 1};
        int R,P, i;
 
        cout << "Podaj ciezar: ";
        cin >> R;
        aWynik = (R-25) / 2;
             
        i=0;
        while (aWynik>0)       //dopoki nie wydano calej reszty
        {
            if (aWynik >= N[i])  //sprawdz czy mozna wydac danym nominalem
        {
            P=aWynik / N[i];   //ile razy wydac dany nominal
            aWynik=aWynik-(N[i]*P); //zmniejsz reszte o wydany nominal
            cout << N[i] << " x " << P << endl; //wypisz wynik
        }
            i++;            //rozpatrz kolejny nominal
        }
    } while (key != 27);
} 
0

Jakieś pomysły? :P

0

Podano ci działający kod czego jeszcze chcesz?

0

Czy Ty aby nie wpisujesz na wejsciu liczby z przecinkiem? A co do Twojego programu dynamicznego - cięzko bedzie wprowadzic 227.5 do inta. Z tablicą cięzarków to samo.

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