Zaokrąglanie liczby w górę

Zaokrąglanie liczby w górę
BQ
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 25
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:

Kopiuj
   //--------------------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:

Kopiuj
    //--------------------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.

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
3

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

BQ
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 25
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?

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
2

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

nalik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1039
2

Można zrobić też tak:

Kopiuj
uint32_t div_ceil(uint32_t a, uint32_t b) {
    return ((uint64_t)a + b - 1) / b;
}
BQ
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 25
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? :)

Kopiuj
    //--------------------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;
kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
2

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

Kopiuj
    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;

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.