problem z sumą dwóch bardzo dużych liczb

0

Witam mam problem z programem ,który miałby dodawać dwie bardzo duże liczby. wydaje mi się,że algorytm jest dobry,ale mimo to program w pewnym momencie źle dodaje. bardzo prosiłbym o szybką pomoc w znalezieniu i naprawieniu tego błędu,gdyż jest to mój projekt na zaliczenie z informatyki,a termin tuż tuż :/ . z góry dzięki. a oto i program:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int main(void)
{
char *licza, *liczb, *wynik,temp;
int n,k,l,i,w,wstale;

printf("Ilo cyfrowa bedzie pierwsza liczba? \n");
scanf("%d",&n);
printf("Ilo cyfrowa bedzie druga liczba? \n");
scanf("%d",&k);

//dynamiczna deklaracja tablic
licza=(char *)malloc(n*sizeof(char));
liczb=(char *)malloc(k*sizeof(char));

//dynamiczna deklaracja tablicy wyniku
if(n>k)
{    
     w=n+1;
     wstale=w;
     wynik=(char *)malloc((n+2)*sizeof(char));
     for(i=0;i<=n;i++)
                       wynik[i]=48;
     wynik[n+1]='\0';
}
else
{    
     w=k+1;
     wstale=w;
     wynik=(char *)malloc((k+2)*sizeof(char));
     for(i=0;i<=k;i++)
                       wynik[i]=48;
     wynik[k+1]='\0';
}

//puts(wynik);

printf("Podaj pierwsza liczbe \n");
scanf("%s",licza);
printf("Podaj druga liczbe \n");
scanf("%s",liczb);

for(w--,l=n-1,i=k-1;w>=0;l--,i--,w--)
{
      if(l>=0 && i>=0)
      {
                         temp=licza[l]+(liczb[i]-48);
                         
                         if(temp>=58)
                         {
                                    wynik[w]+=(temp-58);
                                    wynik[w-1]++;
                         }
                         else
                             wynik[w]+=(temp-48); //48 to wartosc dla zera w ASCII
     }
     if(l>=0 && i<0)
     {
                         if(wynik[w] != 48)
                                     {
                                           temp=licza[l]+wynik[w]-48;
                                          
                                           if(temp>=58)
                                           {
											   //
                                                       wynik[w]+=(temp-58);
                                                       wynik[w-1]++;
                                           }
                                           else
                                               wynik[w] += (temp-48);
                                           
                                     }
                         else
                             wynik[w]=licza[l];
                         
                         
       } 
       if(i>=0 && l<0)
       {
                         if(wynik[w] != 48)
                                     {
                                           temp=liczb[i]+wynik[w]-48;
                                           
                                           if(temp>=58)
                                           {//
                                                       wynik[w]+=(temp-58);
                                                       wynik[w-1]++;
                                           }
                                           else
                                               wynik[w] += (temp-48);
                                           
                                     }
                         else
                             wynik[w]=liczb[i];
                         
       } 
}

//sprawdzenie czy pierwsza cyfra w liczbie to zero, jesli tak, to wypisujemy od drugiej
if(wynik[0]=='0')
                 i=1;
else
    i=0;

//wypisanie wyniku
printf("Suma=");
for(;i<wstale;i++)
                printf("%c" , wynik[i]);

printf("\n");
free(licza);
free(liczb);
free(wynik);





system("PAUSE");
return EXIT_SUCCESS;

}

0

Próbowałem zinterpretować ten kod, ale padłem przy
for(w--,l=n-1,i=k-1;w>=0;l--,i--,w--) :/

Powiedz przynajmiej jaki jest typ błędu - rozumiem że nie kompilacji, ale rzuca ci runtime error czy po prostu wynik jest zły, a jeśli tak to jaki jest wynik dla przykładowych liczb.

Próbowałeś debugować?

Z mojego doświadczenia wynika że w takich sytuacjach w 60% przypadków winę ponosi literówka, np 'n' zamiast 'm')

0

Błędy tak na oko:

    licza=(char *)malloc(n*sizeof(char));
    liczb=(char *)malloc(k*sizeof(char));

User wpisuje n znaków, w pamięci zajmuje to znaków n+1.
To jest też prawodpodobnie powód kiepskiego dodawania Twojego programu. Otóż alokacja pamięci w Twoim programie z dużym prawdopodobieństwem wygląda tak:

[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
 ^                          ^                             ^
 licza                    liczb                          wynik

Otóż Ty najpierw alokujesz tablice, potem inicjalizujesz tablicę wynik zerami, a następnie wczytujesz do liczb string, którego nul może wylądować w miejscu wynik[0]. Przez resztę programu zakładasz integralnośc swoich danych, a to w tym wypadku nikoniecznie musi byc prawdziwe:)

Z uwag stylistycznych:

zamiast

    if(n>k)
    {    
         w=n+1;
         wstale=w;
         wynik=(char *)malloc((n+2)*sizeof(char));
         for(i=0;i<=n;i++)
                           wynik[i]=48;
         wynik[n+1]='\0';
    }
    else
    {    
         w=k+1;
         wstale=w;
         wynik=(char *)malloc((k+2)*sizeof(char));
         for(i=0;i<=k;i++)
                           wynik[i]=48;
         wynik[k+1]='\0';
    }

można napisać:


         w=(n > k) ? (n+1) : (k +1 );
         wstale=w;
         wynik=(char *)malloc((w+1)*sizeof(char)); // dla jasności
         for(i=0;i<w;i++)
                           wynik[i]=48;
         wynik[w]='\0';
0

przy sumowaniu wychodzi zły wynik np. przy dodawaniu liczb 591798549 i 9242321 wychodzi wynik: 710:40870 (5 ostatnich cyfr liczby jest dobre tylko dalej coś się ,że tak powiem wali) i właśnie głównie chodzi o to,ale tez przydało by się usunąć ten Runtime error

0

"Przez resztę programu zakładasz integralnośc swoich danych, a to w tym wypadku nikoniecznie musi byc prawdziwe:)" możesz mi wytłumaczyć co masz na mysli mówiąc integralność moich danych?? sorry,ale jestem mocno początkujący. dopiero w tym roku zacząłem programowac

0

Heh, teraz złapałem. Błąd masz tutaj:

temp=licza[l]+(liczb[i]-48);
                             
                             if(temp>=58)
                             {
                                        wynik[w]+=(temp-58);
                                        wynik[w-1]++;
                             }
                             else
                                 wynik[w]+=(temp-48); //48 to wartosc dla zera w ASCII

Nie łapiesz sytuacji, w której w wynik[w] miałeś 1 i dodajesz do tego 9. Zapisujesz wtedy ":" do tablicy. Poprawione:

temp=licza[l]+(liczb[i]-48) + wynik[w]-48;
                             
                             if(temp>=58)
                             {
                                        wynik[w]=(temp-10);
                                        wynik[w-1]++;
                             }
                             else
                                 wynik[w]=temp;

i tu jeszcze:

if(wynik[w] != 48)
                                         {
                                               temp=liczb[i]+wynik[w]-48;
                                               
                                               if(temp>=58)
                                               {//
                                                           wynik[w]+=(temp-58);
                                                           wynik[w-1]++;
                                               }
                                               else
                                                   wynik[w] += (temp-48);
                                               
                                         }
                             else
                                 wynik[w]=liczb[i];

tutaj też nie uwzględniasz, że w wynik[w] możesz miec'1'.

Poprawka:

temp=licza[l]+wynik[w]-48;
                                              
                                               if(temp>=58)
                                               {
												   //
                                                           wynik[w]=(temp-10);
                                                           wynik[w-1]++;
                                               }
                                               else
                                                   wynik[w] = temp;

A o integralność chodziło mi tyle, że zdarza Ci się nadpisywać własne dane, popraw tam to:
liczb=(char )malloc(ksizeof(char));
na
liczb=(char *)malloc((k+1)*sizeof(char));

I analogicznie:)

0

kurde,stary. nie wpadlbym na to ;-P WIELKIE DZIEKI,mozna powiedziec ze mi tylek uratowales :D kamień z serca normalnie. dzieki!!!

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