Zaokrąglanie liczby w górę

0

Cześc. Jedno z zadań polega na podaniu największego skoku temperatury, zaokrąglając przy tym liczby zawsze do góry. Wartości kolejnych temperatur znajdują się w tablicy ar1. Oto mój kod:

   //--------------------Najwiekszy skok pogodowy dla stacji S1-------------------------

    int skok;
    int maxS=0;     //maksymalny skok

    for(int i=0;i<N;i++) //N jest liczba pomiarow
    {
        for(int j=i+1;j<N;j++)
        {
            skok=(ar1[i]-ar1[j])*(ar1[i]-ar1[j])/(j-i);  //taki wzor na skok temperatury jest podany w tresci zadania
            ceil(skok);  //tutaj zaokraglam liczbe w górę
            if(skok>maxS)
            {
                maxS=skok;
            }
        }
    }

    cout << endl << "Najwiekszy skok temperatury to: " << maxS << endl;

Jednak odpowiedź jest błędna, ponieważ zmienna "maxS" ma wartość 24 a w odpowiedziach jest 25. Kod zaproponowany w rozwiązaniu to:

    //--------------------Najwiekszy skok pogodowy dla stacji S1-------------------------

    int skok;
    int maxS=0;
    int kwadrat;

    for(int i=0;i<N;i++)
    {
        for(int j=i+1;j<N;j++)
        {
            kwadrat=(ar1[i]-ar1[j])*(ar1[i]-ar1[j]);
            skok=kwadrat/(j-i);
            if(skok*(j-i)<kwadrat)
            {
                skok++;
            }
            if(skok>maxS)
            {
                maxS=skok;
            }
        }
    }

    cout << endl << "Najwiekszy skok temperatury to: " << maxS << endl;

Tutaj wartość "maxS" to 25. Mógłby mi ktoś wytłumaczyć, gdzie zrobiłem błąd? Jeżeli brakuje jakichkolwiek danych to przepraszam, proszę dać znać i od razu podeślę. :) Pozdrawiam.

3

ceil na liczbach całkowitych nie ma sensu. A wynikiem dzielenia int przez int jest int.

0
kq napisał(a):

ceil na liczbach całkowitych nie ma sensu. A wynikiem dzielenia int przez int jest int.

Racja... Nie pomyślałem. W takim razie jedynym poprawnym rozwiązaniem jest sposób drugi?

2

Nie wiem czy dla uproszczenia nie zamieniłbym tutaj wyniku pośredniego na double, ale ten drugi kod wydaje się ok.

2

Można zrobić też tak:

uint32_t div_ceil(uint32_t a, uint32_t b) {
    return ((uint64_t)a + b - 1) / b;
}
0

Zmieniłem typ danych na double. Według mnie teraz powinno być dobrze, bo przecież wszystkie operacje będą wykonywane na liczbach zmiennoprzecinkowych. Później wynik w odpowiedzi zaokrąglam funkcją ceil(). Jednak odpowiedź nadal jest 24, czyli o 1 za mało. Tak jakbym źle zastosował funkcję ceil(). Może mi ktoś powiedzieć, gdzie robię błąd? :)

    //--------------------Najwiekszy skok pogodowy dla stacji S1-------------------------

    double skok;
    double maxS=0.0;

    for(int i=0;i<N;i++)
    {
        for(int j=i+1;j<N;j++)
        {
            skok=(ar1[i]-ar1[j])*(ar1[i]-ar1[j])/(j-i);
            if(skok>maxS)
            {
                maxS=skok;
            }
        }
    }

    cout << endl << "Najwiekszy skok temperatury to: " << ceil(maxS) << endl;
2

Zakładam, że ar wciąż jest tablicą liczb całkowitych, więc zamieniłeś dokładnie nie to co było trzeba.

    int skok;
    int maxS=0;
 
    for(int i=0;i<N;i++)
    {
        for(int j=i+1;j<N;j++)
        {
            double kwadrat=(ar1[i]-ar1[j])*(ar1[i]-ar1[j]);
            skok=ceil(kwadrat/(j-i));
            maxS = max(maxS, skok);
        }
    }
 
    cout << endl << "Najwiekszy skok temperatury to: " << maxS << endl;

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