• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z zakresem wartości

Object Storage Arubacloud
0 głosów
519 wizyt
pytanie zadane 18 października 2017 w C i C++ przez k222 Nałogowiec (30,150 p.)
edycja 18 października 2017 przez k222

Cześć, zajmuję się aktualnie problemem wypisywania liczb pierwszych z zakresu <1;n> i napisałem program (sito Eratostenesa) który ogólnie działa ale są dwie rzeczy których nie rozumiem. Kod:

#include <iostream>

using namespace std;

int main()
{
    int n;

    cin>>n;

    n += 1;
    int t[n];
    t[0] = 0;
    t[1] = 0;

    for(int j = 2; j <= n; j++)
    {
        t[j] = 1;
    }

    for(int i = 2; i <= n; i++)
    {
        if(t[i] == 1 && i*i <= n)
        {
            for(int x = i*i; x <=n; x+=i)
                t[x] = 0;
        }
    }

    for(int k = 1; k <= n; k++)
    {
        if(t[k] == 1)
            cout<<k<<"  ";
    }


    return 0;
}

1. Zakres wartości - tutaj wszędzie użyłem int, próbowałem z long long ale problem polega na tym, że program przestaje działać dla n dużo mniejszego od maksymalnej wartości danego typu danych, Przykładowo dla int program nie działa dla n = 100 000 a maksymalną wartością dla int jest chyba ponad 2 000 000 000 więc dużo więcej i tutaj pojawia się moje pytanie - dlaczego program nie działa dla wartości większych? Dodam że jak użyłem long long to granica się podniosła, ale dla 260 000 nie działał a zakres jest dużo większy

2. Druga sprawa to tablice - jak deklaruję tablicę int t[5] to zawiera ona elementy t[0] t[1] t[2] t[3] t[4]. Ja w programie wpisuję n i dalej dodaję 1 do tego n (n += 1) tak żeby tablica t[n] zawierała elementy od t[0] do t[n]. Jak to zatem możliwe że po uruchomieniu programu i wpisaniu 100 ostatnią wypisaną przez program liczbą jest 101?

komentarz 19 października 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Ten kod:

cin>>n;
...
int t[n];

Jest niezgodny ze standardem języka C++. VLA jest poprawne np. w C, choć z tego co wiem to nie jest zalecane.

2 odpowiedzi

0 głosów
odpowiedź 18 października 2017 przez obl Maniak (51,280 p.)
wybrane 18 października 2017 przez k222
 
Najlepsza

Masz tam mnożenie i * i dla wartości i od 0 do <= n więc gdy n = 100 000 to i * i = 10 000 000 000 a zakres int-a to od -2 147 483 648 do 2 147 483 647

Poza tym działasz na liczbach naturalnych więc lepiej używać unsigned int

komentarz 18 października 2017 przez k222 Nałogowiec (30,150 p.)
Ok, tylko mam pytanie bo jest tam to i*i i to działanie nie jest przypisane do żadnej zmiennej, jest za to porównywane z int, więc jak to dokładnie działa - jak mamy porównanie int i działania to to działanie komputer bierze za inta? Albo ogólnie mamy porównanie zmiennej i działania to to działanie jest widziane jako zmienna takiego typu jak ta z którą porównujemy?
komentarz 18 października 2017 przez Huberti Gaduła (4,500 p.)
C++ traktuje wszystkie stałe całkowite jako wartość typu int, o ile nie występują wyjątki.

Pierwszym wyjątkiem jest dodanie do stałej przyrostka określającego typ, drugim wartość zbyt duża dla int.
komentarz 18 października 2017 przez obl Maniak (51,280 p.)
Tak to jest porównanie int-a z int-em bo operator mnożenia dla tych dwóch wartości zwraca wartość typu int. Operatory to są też funkcje, które realizują zazwyczaj pewne podstawowe matematyczne działania.
komentarz 18 października 2017 przez k222 Nałogowiec (30,150 p.)

Pierwszym wyjątkiem jest dodanie do stałej przyrostka określającego typ, drugim wartość zbyt duża dla int.

Skoro tak to czy w tym przypadku nie powinien to być wyjątek (zbyt duża dla int)?

 

komentarz 19 października 2017 przez Huberti Gaduła (4,500 p.)
Tak to jest wyjątek. Kiedy wartość stałej całkowitej przekracza zakres int, zostaje zmieniona na taką, która może ją pomieścić.
0 głosów
odpowiedź 18 października 2017 przez Huberti Gaduła (4,500 p.)
edycja 18 października 2017 przez Huberti

1. Możliwe, że brakuje Ci pamięci ram. Rezerwowanie  260000 zmiennych to duży ubytek pamięci.

Maksymalną wartość zmiennej możesz sprawdzić stosując bibliotekę <climits>.

Przykładowo:

#include <iostream>
#include <climits>

int main ()
{
          std::cout<<INT_MAX; // pokaz maksymalna wartosc int
          std::cout<<std::endl<<INT_MIN;  // pokaz minimalna wartosc int        
          return 0;
}

2.

Linijka n += 1; zwiększa n o 1. Więc po wpisaniu 100 twój program dodaje jedynkę i rezerwuje t[n] czyli t[101].

komentarz 18 października 2017 przez k222 Nałogowiec (30,150 p.)
edycja 18 października 2017 przez k222
1.Myślę że nie bo raz że mam 8GB i tylko ten program działał a dwa że dla int granicą była dużo niżej niż long long więc to zależy od typu

2.jak deklaruje aż tablice int t[5] to nie możesz potem w programie napisać t[5] = 8; bo taki element nie istnieje (istnieją od 0 do 4 i w sumie jest ich 5)

Podobne pytania

0 głosów
4 odpowiedzi 4,847 wizyt
pytanie zadane 8 lipca 2015 w C i C++ przez k222 Nałogowiec (30,150 p.)
0 głosów
3 odpowiedzi 994 wizyt
pytanie zadane 26 lipca 2019 w C i C++ przez Jacob7 Użytkownik (540 p.)
0 głosów
2 odpowiedzi 461 wizyt
pytanie zadane 27 grudnia 2016 w Matematyka, fizyka, logika przez qlucha Obywatel (1,790 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...