Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Skrócony regulamin

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



 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Algorytmy + inżynieria oprogramowania
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Bako
Gość





PostWysłany: Sob Sty 16, 2010 9:14 pm      Temat postu: Problem z sumą dwóch bardzo dużych liczb Odpowiedz z cytatem Pisownia

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ż :/ . pisze w języku c w programie Visual Studio 2008 z góry dzięki. a oto i program:
Kod:
#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;
}
Powrót do góry
izaw



Dołączył: 12 Wrz 2008
Posty: 1435
Skąd: Łódź

PostWysłany: Sob Sty 16, 2010 11:47 pm      Temat postu: Odpowiedz z cytatem Pisownia

1. Zamiast zmiennych n oraz k zastosuj nazwy coś mówiące. Ogólnie nazwy powinny określać przeznaczenie zmiennych. Przy twoim sposobie łatwo sie pogubić co dana zmienna znaczy.
2. Linie 18 i 19 nieodpowiednie rozmiary buforów. Gdzie mijsce na terminalny znak łańcuchów?
3. Czy nie prościej byłoby zaalokować jednakowe bufory odpowiadające większej liczbie?
4. Linia 28 i inne. Co to jest 48? Losowanie lotto? Stosuje się znaki, tutaj '0'. Zresztą w następnej linii już to zrobiłeś.
5. Linia 21 i następne. Poco inicjalizujesz całą tablicę?
6. Strasznie dłuuugi algorytm.
- wczytuj tak, aby odpowiadające sobie wagi cyfr były w tym samym miejscu,
- zamiast trzeciego bufora na wynik, użyj operatora +=,
- nie uwzględniasz ujemnych liczb. Dopuszczalne?

_________________
"Nic nie jest tak proste, by nie można było wykonać tego źle" - Prawo Murph'ego
"Więcej wysiłku wymaga udawanie, że się wie, niż dowiedzenie się." - (Agatha Christie)
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Algorytmy + inżynieria oprogramowania Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.27450 sekund, zapytan = 10
contact

| Darmowe programy i porady Jelcyna | VB4all | Promocje.biz | Tansze zakupy w Helionie | Skróć długi link |