Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [c] działania na dużych liczbach
drzalek
post
Post #1





Grupa: Zarejestrowani
Postów: 170
Pomógł: 18
Dołączył: 6.03.2007

Ostrzeżenie: (0%)
-----


Mam następujący problem.

Do szkoły potrzebuję napisać program w C. Ponieważ nie chcę gotowców zabrałem się za to sam, nie programuję w C w sumie w ogóle więc zaczęły się schody i teraz potrzebuję pomocy. Zatem do rzeczy

Na wejście wczytywane są jakieś zestawy liczb. Każdy zestaw składa się z dwóch liczb całkowitych dodatnich, z których każda może mieć maksymalnie 1000 cyfr (czyli wielgachne liczby).

Na wyjście program ma zwrócić różnicę tych dwóch liczb i sume, w nowej linii (oczywiście dla każdego zestawu).

Przykład działania:

Wejście
100 200
10 3
20 30
Wyjście
-100
300
7
13
-10
50

No i udało mi się skonstruować coś takiego:
  1. <?php
  2. #include <stdio.h>
  3. #include<string.h>
  4.  
  5. char* dodawanie(char liczba1[],char liczba2[], char suma[])
  6.        {
  7.        
  8.        int dlugosc=strlen(liczba1), p=0, w;
  9.      
  10.  
  11.        suma[dlugosc]=0;
  12.  
  13.                while ((dlugosc--)>=0)
  14.                {
  15.  
  16.                w=(liczba1[dlugosc]-'0')+(liczba2[dlugosc]-'0')+p;
  17.                        if(w>=10)
  18.                        {
  19.                                suma[dlugosc]=(w-10)+'0';
  20.                                p=1;
  21.                                
  22.                        }
  23.  
  24.                        else
  25.                        {
  26.                                suma[dlugosc]=w+'0';
  27.                                p=0;
  28.                                
  29.                        }
  30.  
  31.                }
  32.              return suma;
  33.  
  34.        }
  35.      
  36. char* odejmowanie(char liczba1[],char liczba2[], char roznica[])
  37.        {
  38.        
  39.        int dlugosc=strlen(liczba1), q=0, v;
  40.      
  41.  
  42.        roznica[dlugosc]=0;
  43.  
  44.                while ((dlugosc--)>=0)
  45.                {
  46.  
  47.                v=(liczba1[dlugosc]-'0')-(liczba2[dlugosc]-'0')-q;
  48.                        if(v < 0)
  49.                        {
  50.                                roznica[dlugosc]=(v+10)+48;
  51.                                q=1;
  52.                        }
  53.  
  54.                        else
  55.                        {
  56.                                roznica[dlugosc]=v+48;
  57.                                q=0;
  58.                        }
  59.  
  60.                }
  61.  
  62.        return roznica;
  63.  
  64.        }
  65.      
  66. void zerowanie(char tab[], int ilosc)
  67.        {
  68.  
  69.        char tabz[1001]="";
  70.  
  71.        while(ilosc--) strcat(tabz,"0");
  72.  
  73.        strcat(tabz,tab);
  74.  
  75.        strcpy(tab,tabz);
  76.  
  77.        }
  78.  
  79.  
  80. int main () {
  81.  
  82. char liczba1[1001], liczba2[1001], wynik[1002], wynik2[1002];
  83. int dlugosc1, dlugosc2;
  84.  
  85. while(scanf("%s %s", liczba1, liczba2)==2)
  86. {
  87. dlugosc1=strlen(liczba1);
  88. dlugosc2=strlen(liczba2);
  89.  
  90.        if(dlugosc1<dlugosc2) zerowanie(liczba1,dlugosc2-dlugosc1);
  91.  
  92.        if(dlugosc2<dlugosc1) zerowanie(liczba2,dlugosc1-dlugosc2);
  93.  
  94.      
  95. printf("%s\n%s\n", odejmowanie(liczba1,liczba2,wynik), dodawanie(liczba1,liczba2,wynik2));
  96.  
  97. }
  98.  
  99. return 0;
  100.  
  101. }
  102. ?>


No i wszystko ładnie pięknie działa, ale jest jeden problem - otrzymuję złe wyniki w kilku przypadkach.
1. Jeśli zmienia się ilość cyfr wyniku w stosunku do ilości cyfr w liczbie np: 1+99 powinno dać 100, a daje 00. Przy odejmowaniu z kolei 100-1 powinno dać 99 a daje 099.
2. Nie mogę sobie poradzić z odejmowaniem jeśli wynikiem jest liczba ujemna, zwraca mi wtedy jakiś dziwny wynik na plusie.
3. Jest związane z 1 i 2, nie mam pojęcia jak przekazać na początku tablicy znak - lub dodatkową jedynkę w przypadku takim jak podałem w pkt 1.

Jeśli jest tu ktoś kto umiałby mi pomóc to byłbym wdzięczny (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

P.S.
Oczywiście ten kod php to tylko tak, żeby pokolorowało jakoś, bo dla c tu nie ma (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował drzalek 8.03.2009, 22:58:42
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
erix
post
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




A próbowałeś: http://www.codeproject.com/KB/cpp/CppIntegerClass.aspx
?
Go to the top of the page
+Quote Post
drzalek
post
Post #3





Grupa: Zarejestrowani
Postów: 170
Pomógł: 18
Dołączył: 6.03.2007

Ostrzeżenie: (0%)
-----


Nie, nie próbowałem, to jest dla mnie jeszcze bardziej skomplikowane, wiem, że wystarczy ustawić np "-" w przypadku liczby ujemnej na początku tablicy, podobnie ustawić 1 w przypadku dodawania, gdy zmienia się ilość cyfr i zwrócić wskaźnik na ostatni wstawiony znak.

"Zwrócić wskaźnik" to jest dla mnie abstrakcja, w ogóle nie mogę zajarzyć o co chodzi.
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


Hmm, dodawanie w slupku to podstawowka (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

Cytat
Nie mogę sobie poradzić z odejmowaniem jeśli wynikiem jest liczba ujemna, zwraca mi wtedy jakiś dziwny wynik na plusie.

Wyrownaj dlugosc liczb, coby dobrze ci sie na nich operowalo (od cyfr jednosci do najwyzszych). Przy odejmowaniu sprawdz ktora jest wieksza, i odejmij wieksza od mniejszej, i ustal znak jaki bedzie miala roznica.

Cytat
Jeśli zmienia się ilość cyfr wyniku w stosunku do ilości cyfr w liczbie np: 1+99 powinno dać 100, a daje 00. Przy odejmowaniu z kolei 100-1 powinno dać 99 a daje 099.

Dodawanie 2ch liczb moze dac ci liczbe max o 1 cyfre dluzsza (jesli przeniesienei z najwyzszej pozycji jest 1 to sie liczba wydluzy, jak 0 to nie) - przygotuj sie na to wydluzajac tablice/stringa, a odejmowanie - dowolnie krotsza np: 9999 - 9993 = 0006 => 6. Wydaje mi sie ze wystarczy przejrzec wynik i uciac go od lewej do pierwszego niezera.

Cytat
Jest związane z 1 i 2, nie mam pojęcia jak przekazać na początku tablicy znak - lub dodatkową jedynkę w przypadku takim jak podałem w pkt 1.

Albo utworz strukture Liczba: {wartosc, znak}, albo zainteresuj sie formatem U2 np. http://portalwiedzy.onet.pl/89634,,,,uzupe...woch,haslo.html (tzn poszukaj lepszych linkow) - obsluguje latwo dodawanie, odejmowanie, liczby ujemne.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 15:15