Advertisement
Guest User

Untitled

a guest
Feb 20th, 2018
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.40 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdbool.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <math.h>
  6.  
  7. #define MAX (1001)
  8.  
  9. /*
  10.     Zadatak je sa kursa "Uvod u algoritme" sa sajta petlja.org
  11.     lekcija: Uvod
  12.     zadatak: sabiranje 4
  13.  
  14.  
  15.     max vreme:          1s
  16.     max memorija:   1000mb
  17.     ulaz:                       stdin
  18.     izlaz:                  stdout
  19.  
  20.  
  21.     1) U prvom redu standardnog ulaza se nalazi broj A. U drugom redu se nalazi broj B.
  22.     2) U prvom redu standardnog izlaza ispisati zbir brojeva A i B.
  23.     3) Ograničenja: -10^1000 <= A, B <= 10^1000
  24.  
  25.  
  26. */
  27.  
  28. void sum(char *A, char *B, int nA, int nB, int prenos);
  29.  
  30.  
  31. int main(){
  32.  
  33.     char A[MAX], B[MAX];
  34.  
  35.  
  36.     scanf("%s", A);
  37.     scanf("%s", B);
  38.  
  39.     int nA = strlen(A) - 1;
  40.     int nB = strlen(B) - 1;
  41.  
  42.  
  43.     sum(A, B, nA, nB, 0);
  44.     printf("\n");
  45.  
  46.  
  47.    
  48.  
  49.     return 0;
  50.  
  51. }
  52.  
  53. void sum(char *A, char *B, int nA, int nB, int prenos){
  54.  
  55. /*
  56.     Funkcija prima vrlo dugačke brojeve predstavljene kao stringove i njihove brojeve cifara.
  57.     Ideja algoritma je računanje zbirova cifara od poslednjih ka prvim u oba stringa, a usput i
  58.     beleženje da li postoji prenos +1 na sledeću cifru.
  59.  
  60. */
  61.     int tmpBroj;
  62.  
  63.     if(nA < 0 && nB < 0){               // uslov izlaska iz rekurzije - ukoliko su oba brojača < 0,
  64.         if(prenos == 1){                        // i ukoliko ne postoji prenos za dodatnu cifru
  65.             tmpBroj = 1;                            // u suprotnom će se samo ispisati jedinica (valjda)
  66.             prenos = 0;
  67.         }
  68.         else
  69.             return;
  70.     }
  71.  
  72.     int cA;
  73.     int cB;
  74.     int tmpPrenos;
  75.    
  76.     if(nA >= 0 && nB >= 0) {        // oba brojača su validna - sabiraju se cifre od oba broja
  77.  
  78.         cA = A[nA] - '0';
  79.         cB = B[nB] - '0';
  80.  
  81.         tmpBroj = cA + cB + prenos;
  82.  
  83.         if(tmpBroj > 9){
  84.             tmpPrenos = 1;
  85.             tmpBroj = tmpBroj%10;
  86.         }
  87.         else
  88.             tmpPrenos = 0;
  89.  
  90.         nA--;
  91.         nB--;
  92.  
  93.         sum(A, B, nA, nB, tmpPrenos);
  94.     }
  95.  
  96.     else if(nA < 0) {                       // brojač za A nije validan, uzima se samo cifra od B
  97.                                                             // i nastavlja se brojanje do kraja B
  98.         tmpBroj = B[nB] - '0' + prenos;
  99.    
  100.         if(tmpBroj > 9){
  101.             tmpPrenos = 1;
  102.             tmpBroj = tmpBroj%10;
  103.         }
  104.         else
  105.             tmpPrenos = 0;
  106.  
  107.         nB--;
  108.  
  109.         sum(A, B, nA, nB, tmpPrenos);
  110.     }
  111.  
  112.     else if(nB < 0){                        // brojač za B nije validan, uzima se samo cifra od A
  113.                                                             // i nastavlja se brojanje do kraja A
  114.         tmpBroj = A[nA] - '0' + prenos;    
  115.        
  116.         if(tmpBroj > 9){
  117.             tmpPrenos = 1;
  118.             tmpBroj = tmpBroj%10;
  119.         }
  120.         else
  121.             tmpPrenos = 0;
  122.  
  123.  
  124.         nA--;
  125.  
  126.         sum(A, B, nA, nB, tmpPrenos);
  127.  
  128.     }
  129.  
  130.  
  131.     printf("%d", tmpBroj);
  132.  
  133.  
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement