Liczba najbliższa zeru - jeśli ujemna to zamiana znaku.

0

Witam,

Dziś zacząłem zabawe na stronce codingame, i jestem przy takim zadaniu:
https://www.codingame.com/ide/puzzle/temperatures

Trzeba napisać kod który sposród podanych liczb dodatnich i ujemnych wybierze tą najbliższą zeru a jeśli to liczba ujemna to zamieni na dodatnią, póki co mam taki kod:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()
{
    int n; // the number of temperatures to analyse
    scanf("%d", &n); fgetc(stdin);
    char temps[257]; // the n temperatures expressed as integers ranging from -273 to 5526
    fgets(temps, 257, stdin); // the n temperatures expressed as integers ranging from -273 to 5526

    int tempx = 5527;
    
    for (int i = 0; i < n; i++){
        if(temps[i] > 0 && temps[i] < tempx)
        tempx = (int)temps[i];
        fprintf(stderr,"%d, ", temps[i]);
    }
    
    printf("%d", tempx);

    return 0;
}

Niby wybiera najniższą liczbe ale mam dziwny output, wybiera sposród liczb takich jak 32,45,50... a z tego co przeczytałem output powinien być mniej więcej 1,-2,-8,5...
Trzeba jakoś zamienić tą tablice charów na inty żeby dało mi to takie outputy a zabardzo nie wiem jak, z tą liczbą ujemną też zbytnio nie wiem, bo jeśli dam żeby znalazło najmniejszą to znajdzie np -105 i zamieni na 105 a to już najniższa nie będzie. Ogólnie znam elementy tego języka bo już trochę z nim obcuję ale nadal mam problemy z kreatywnością, z wymyśleniem rozwiązania dla problemów, dlatego staram się właśnie podszkalać na rozwiązywaniu różnych problemów, ale dalej mi trochę opornie idzie ale może z czasem to się zmieni. Wiecie może jak mógłbym zadziałać z tym problemem ?

1

a jeśli to liczba ujemna to zamieni na dodatnią

Nieprawda, przeczytaj treść zadania jeszcze raz uważnie.

Generalnie ten ich szablon kodu C jest strasznie durny i zagmatwa sprawę. Polecam zacząć od takiego szablonu:

int main()
{
    int n; // the number of temperatures to analyse
    scanf("%d", &n);
    ......
    for (int i = 0; i < n; ++i)
    {
        int tmp;
        scanf("%d", &tmp);
        .....
    }

    ....
    return 0;
}

Rozwiązanie jest proste, wystarczy korzystać z funkcji abs().

0

Ale dlaczego ja w outpucie mam te liczby powyżej 30 skoro powinny w tym zadaniu być poniżej 10 ? I przeczytałem dokładnie zadanie, jeśli najbliższa zeru będzie liczba ujemna to w wyniku ma być odjęty znak minusa.

0

Ponieważ wczytujesz ciąg znaków, a nie liczby ;p

0
marx21. napisał(a):

Ale dlaczego ja w outpucie mam te liczby powyżej 30 skoro powinny w tym zadaniu być poniżej 10 ?

Bo np. cyfra '0' ma wartość liczbową 48 w tablicy ASCII, '1' ma wartość 49 itd.

I przeczytałem dokładnie zadanie, jeśli najbliższa zeru będzie liczba ujemna to w wyniku ma być odjęty znak minusa.

Doprawdy? Ciekawa interpretacja zdania If two numbers are equally close to zero, positive integer has to be considered closest to zero

0
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int n;
    cin >> n;
    
    if (n==0)
    {
        cout << '0' << endl;
        return 0;
    }
    
    for (int i=0; i<n; ++i)
    {
        int x;
        cin >> x;
        …
    }
    
    cout << result << endl;

    return 0;
}
0

@twonek - 1.Faktycznie mój błąd w interpretacji zadania, w takim razie może najpierw sprawdzę w jednej pętli te ujemne i wybiore najbliższą zera, drugą pętlą te dodatnie i wybiorę tą najbliższą a następnie porównam dwie i wybiore wynik ? To dobre rozwiązanie czy może masz pomysł na jakieś prostsze ? 2. A jak mogę zamienić ten ciąg znaków na liczby ? próbowałem jawnego rzutowania na int ale nie pomogło.

0

czy może masz pomysł na jakieś prostsze ?

Pzecież napisałem

Rozwiązanie jest proste, wystarczy korzystać z funkcji abs().

http://en.cppreference.com/w/c/numeric/math/abs


> A jak mogę zamienić ten ciąg znaków na liczby ?

Jeśli korzystasz z mojego szablonu to nie musisz niczego zamieniać, bo od samego początku masz liczby.

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