 |
Coders' city Nasza pasja to programowanie!
|
| Zobacz poprzedni temat :: Zobacz następny temat |
| Autor |
Wiadomość |
Bako Gość
|
Wysłany: Sob Sty 16, 2010 9:14 pm Temat postu: Problem z sumą dwóch bardzo dużych liczb |
|
|
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ź
|
Wysłany: Sob Sty 16, 2010 11:47 pm Temat postu: |
|
|
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 |
|
 |
|
|
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
|