Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [c] działania na dużych liczbach
Forum PHP.pl > Inne > Hydepark
drzalek
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 smile.gif

P.S.
Oczywiście ten kod php to tylko tak, żeby pokolorowało jakoś, bo dla c tu nie ma smile.gif
erix
A próbowałeś: http://www.codeproject.com/KB/cpp/CppIntegerClass.aspx
?
drzalek
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.
dr_bonzo
Hmm, dodawanie w slupku to podstawowka 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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.