Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Ciąg geometryczny o sumie 130

Ostatnio zmodyfikowano 2016-03-02 18:01
Autor Wiadomość
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:

C/C++
#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?
P-145283
Gibas11
» 2016-02-25 13:45:53
C/C++
float q = j / k;
Przyjrzyj się k. ;) I najpierw z j musisz zrobić zmienną typu float, inaczej wynik też będzie typu int, polecam
static_cast < float >( j )
.
P-145284
Rashmistrz
» 2016-02-27 20:43:31
C/C++
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:
C/C++
#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

P-145367
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.
P-145377
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. :|
P-145380
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.
P-145381
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
C/C++
//obliczenia
130 =( 2 ^ 1 )( 5 ^ 1 )( 13 ^ 1 ) //zapis w postaci iloczynu liczb pierwszych
( 1 + 1 )( 1 + 1 )( 1 + 1 ) = 8 //wzór na ilość dzielników
D( 130 ) = { 1, 2, 5, 10, 13, 26, 65, 130 } //wszystkie dzielniki
i + iq +( iq ^ 2 ) +( iq ^ 3 ) = 130 //równanie trzeciego stopnia
1 + q +( q ^ 2 ) +( q ^ 3 ) = 130 / i //podzielenie obu stron przez "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:
C/C++
//obliczenia
1 + q +( q ^ 2 ) +( q ^ 3 ) = 130 / i //podzielenie obu stron przez "i"
q +( q ^ 2 ) +( q ^ 3 ) =( 130 / i ) - 1 //przeniesienie "1" na drugą stronę
q[ 1 + q +( q ^ 2 ) ] =( 130 / i ) - 1 //wyłączenie "q" przed nawias
( 130 / i ) - 1 = { 0, 1, 4, 9, 12, 25, 64, 129 } //możliwe wartości nieujemne wyrażenia "(130/i)-1"
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.
P-145429
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 :)?
P-145472
« 1 » 2
  Strona 1 z 2 Następna strona