2014-10-09 34 views
5

Jestem całkiem nowym programistą i właśnie bawiłem się dzisiaj kodowaniem próbując korzystać z funkcji i zrobiłem prosty fragment kodu, który rozwiązał problem matematyczny, który miałem na jednej z moich lekcji. w zasadzie przyjmuje wzór (ilość bakterii) * 2^godzin i oblicza to.Jak radzić sobie z przepełnieniem w C

Mój problem polega na tym, że kiedy dostaję naprawdę dużą liczbę, to nie powraca poprawnie, zawsze otrzymuję -2147483648 z powrotem po pewnym rozmiarze numeru. Zgaduję, że ma to coś wspólnego z przepełnieniem, ale nie jestem w 100% pewien, jak to działa. Próbuję dowiedzieć się, jak uzyskać rzeczywiste liczby, których szukam po tym, jak trafiłem na to przepełnienie. Więc co mogę zrobić, aby poradzić sobie z przepełnieniem?

Początkowo ustawiałam wszystko na int, ale po pewnym lekturze myślę, że być może zmiana wszystkiego na długo może mi pomóc, ale tak się nie stało, jeśli jest to dla mnie straszne, pozwól wiedzieć! Również numery testowe, których używam, to 1500 i 24, które zawsze zwracają powyższą liczbę.

Oto kod Dzięki!

#include<stdio.h> 
#include<math.h> 
long bacteria(long b, long h); 

int main(void) 
{ 
     long f,g; 

     scanf("%ld%ld",&f,&g); 
     f = bacteria(f,g); 
     printf("%ld\n",f); 

return 0; 
} 

long bacteria(long b,long h) 
{ 
     long d; 
     printf("%ld %ld\n",b,h); 
     d = b * (pow(2,h)); 

return d; 
} 
+3

Wykorzystanie 'powl' dla' long', '' pow' powraca double' –

+0

mam jakiś kod [tutaj] (https://groups.google.com/d/topic/comp.lang .apl/Lu2tgqanK5Q/dyskusja) w większości pochodzą z kodu przykładowego w CFAQ. –

+0

Dziękujemy! Nie miałem pojęcia, że ​​pow zwrócił podwójną! – Yosvan10

Odpowiedz

2

Tak, twój podejrzany o przepełnienie ma rację. Typ danych C ma pewien zasięg. Aby poradzić sobie z przypadkami, w których potrzebujesz szerszego zakresu, musisz użyć trochę bignum library. Zauważ też, że pow zwraca podwójnie, a nie long, jak można się spodziewać.

Jeśli nie zależy Ci na precyzji, możesz użyć double zamiast long, która obsługuje znacznie szerszy zakres.

Live example here

+0

Dzięki temu pomogła tona! – Yosvan10

+0

Cieszę się, że pomogło. –

1

zastosowanie longlong typ danych, zamiast prostego długo zawierających większe wartości.

+2

Myślę, że to nie jest nierozsądna odpowiedź - w ostatecznym rozrachunku nie chodzi o pytanie, co zrobić z nadmiarem, kiedy to się zdarza, ale przynajmniej będzie działać dłużej! – Synchro

+0

Akceptuję, że dostarczone rozwiązanie nie rozwiąże problemu przepełnienia. Są jednak bardzo duże szanse, że zastosowanie długotrwałego typu danych rozwiąże kwestię Yosvan10. – Wajahat

2

Dobre pytanie. Stawiłem czoła temu samemu problemowi, po jakimś czasie wykorzystałem poniższy przykład. Sprawdź to, jeśli to pomaga

http://discuss.codechef.com/questions/7349/computing-factorials-of-a-huge-number-in-cc-a-tutorial

kod poniżej z linku powyżej.

#include<stdio.h> 
int main() 
{ 
    int t; 
    int a[200]; //array will have the capacity to store 200 digits. 
    int n,i,j,temp,m,x; 

    scanf("%d",&t); 
    while(t--) 
    { 
     scanf("%d",&n); 
     a[0]=1; //initializes array with only 1 digit, the digit 1. 
     m=1; // initializes digit counter 

     temp = 0; //Initializes carry variable to 0. 
     for(i=1;i<=n;i++) 
     { 
      for(j=0;j<m;j++) 
      { 
       x = a[j]*i+temp; //x contains the digit by digit product 
       a[j]=x%10; //Contains the digit to store in position j 
       temp = x/10; //Contains the carry value that will be stored on later indexes 
      } 
      while(temp>0) //while loop that will store the carry value on array. 
      { 
       a[m]=temp%10; 
       temp = temp/10; 
       m++; // increments digit counter 
      } 
     } 
       for(i=m-1;i>=0;i--) //printing answer 
       printf("%d",a[i]); 
       printf("\n"); 
    } 
    return 0; 
} 
+0

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej umieścić tutaj istotne części odpowiedzi i podać link do odsyłacza. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. – RobV

+0

Dodano kod, jak również powyżej, z komentarzami. – Vaibhav

Powiązane problemy