macwojs Temat założony przez niniejszego użytkownika |
Ciąg geometryczny o sumie 130 » 2016-02-25 13:27:31 Witam Próbuję napisać program który znajdzie takie cztery liczby całkowite, że kolejno stworzą ciąg geometryczny o sumie 130. Liczby są na pewno normalne. Mam coś takiego, ale program nie działa: #include <iostream> #include <math.h> using namespace std; int main() { for( int i = 1; i <= 50; i++ ) { for( int j = 1; j <= 6; j++ ) { for( int k = 0; k <= 10; k++ ) { float q = j / k; float s = 0; s = i + i * q + i * q * q + i * q * q * q; if( s == 130 ) { cout << s << "\t Liczba a1:" << i << "\t Wspolczynnik q: " << q << "\n"; } } } } return 0; }
Niestety program nie chce się uruchomić. Nie widzę żadnego błędu. Możliwe, że przekraczam jakiś bufor systemu i dla tego jest błąd? |
|
Gibas11 |
» 2016-02-25 13:45:53 Przyjrzyj się k. ;) I najpierw z j musisz zrobić zmienną typu float, inaczej wynik też będzie typu int, polecam static_cast < float >( j ) . |
|
Rashmistrz |
» 2016-02-27 20:43:31 for( int k = 0; k <= 10; k++ ) { float q = j / k;
Nie można dzielić przez zero! ___________________________________ Widzę, że trafiłeś na to samo zadanie co ja. :D Sam próbuję to rozwiązać i uzyskałem to: #include <iostream> using std::cout;
int main() { int a, b, c, d, q; for( a = 0; a < 256; a++ ) for( q = 0; q < 16; q++ ) { b = a * q; c = b * q; d = c * q; if(( a + b + c + d ) == 130 ) cout << a << '.' << b << '.' << c << '.' << d << '\n'; } return 0; }
ale niestety wyniku ( 130.0.0.0 ) mi nie przyjęło. EDIT: Jeszcze nie próbowałem dla ujemnych... EDIT 2: Nie przewidziałem też, że 'q' może by liczbą rzeczywistą. Ja się na dziś już poddaję... :C |
|
jankowalski25 |
» 2016-02-28 00:13:17 Jeszcze nie próbowałem dla ujemnych... |
To spróbuj i wpisz znaleziony wynik. A jeśli nie chcesz sprawdzać na piechotę wszystkich możliwości, to po prostu rozwiąż równanie sześcienne. //edit: Nie przewidziałem też, że 'q' może by liczbą rzeczywistą. |
Przyjmij, że wszystkie wartości są całkowite. W tak określonej dziedzinie istnieją tylko dwa rozwiązania, zresztą pierwsze z nich sam podałeś. Cała reszta to pary liczb rzeczywistych oraz zespolonych, z których żadna nie będzie na pewno całkowita. //edit2: Jeśli szukasz prostego rozwiązania, to użyj rozkładu liczb całkowitych na czynniki pierwsze. |
|
Gibas11 |
» 2016-02-28 14:11:15 W tym wypadku (sam na to ostatnio trafiłem) wystarczyło zrobić float q i zwiększać je o 0.1 a potem w kilku miejscach rzutować wyniki na int. Dostałem kilkanaście ciągów (większość zła nawet pod względem geometryczności), ale jeden zadziałał. ;) EDIT: Tak wiem, chamskie rozwiązanie i nie o to chodziło... ale zaliczyłem zadanie i chyba o to się liczy. :| |
|
Rashmistrz |
» 2016-02-28 17:30:06 @jankowalski25 To spróbuj i wpisz znaleziony wynik. |
Przyjmij, że wszystkie wartości są całkowite. |
No właśnie na tym się przejechałem... ale za to uzyskałem: 230.52.152.208 (-26.52.-104.208 dla jasności... q = -2) W zadaniu było napisane, że wynik ma mieć formę IP, więc same wyrazy powinny być dodatnie i mniejsze od 256. @Gibas11 Ja zrobiłem dwie pętle zagnieżdżone, gdzie 'a' i 'b' było inkrementowane, a 'q' wyliczałem dzieląc 'b' przez 'a', następnie wyliczałem kolejno 'c' i 'd'. Na końcu sumowałem i sprawdzałem czy jest równe. |
|
jankowalski25 |
» 2016-02-29 22:09:03 Jeśli szukasz prostego rozwiązania, to użyj rozkładu liczb całkowitych na czynniki pierwsze. |
130|2 65|5 13|13 1 130 =( 2 ^ 1 )( 5 ^ 1 )( 13 ^ 1 ) ( 1 + 1 )( 1 + 1 )( 1 + 1 ) = 8 D( 130 ) = { 1, 2, 5, 10, 13, 26, 65, 130 } i + iq +( iq ^ 2 ) +( iq ^ 3 ) = 130 1 + q +( q ^ 2 ) +( q ^ 3 ) = 130 / i
1. Podstawić za i najpierw dodatnie dzielniki, a następnie odpowiadające im liczby ujemne. 2. Rozwiązać równania trzeciego stopnia w dziedzinie liczb całkowitych. 3. Wpisać wynik. //edit: Można jeszcze prościej: 1 + q +( q ^ 2 ) +( q ^ 3 ) = 130 / i q +( q ^ 2 ) +( q ^ 3 ) =( 130 / i ) - 1 q[ 1 + q +( q ^ 2 ) ] =( 130 / i ) - 1 ( 130 / i ) - 1 = { 0, 1, 4, 9, 12, 25, 64, 129 }
1. Wypisać dodatnie dzielniki dla wszystkich wartości z ostatniego zbioru oraz odpowiadające im liczby ujemne. 2. Podstawiać je za q aż do uzyskania równości. 3. Wpisać wynik. |
|
macwojs Temat założony przez niniejszego użytkownika |
» 2016-03-01 22:54:48 Dałem plamę z tym zerem. Pół godziny patrzałem co jest źle i nie widziałem tego maleńkiego zera.
Niestety dopiero dziś miałem czas poprawić program i wyszedł wynik 16.24.36.54, niestety zagadka się już zmieniła i nie mam możliwości sprawdzić poprawności. Może ktoś potwierdzić skoro nie tylko ja się bawiłem :)? |
|
« 1 » 2 |