Advertisement
Guest User

Untitled

a guest
Feb 9th, 2016
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.15 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. #define MAX_DIGITS 500
  6. #define ZERO_CHAR '0'
  7. #define TERMINATION_CHAR '\0'
  8.  
  9. // Prima 2 broja i vraca veci
  10. int max(int first, int second) {
  11.   if (first > second)
  12.     return first;
  13.   return second;
  14. }
  15.  
  16. // Pretvara znamenku tipa 'char' u znamenku tipa 'int', npr. '1' u 1
  17. int charToInt(char digit) {
  18.   return digit - ZERO_CHAR;
  19. }
  20.  
  21. // Pretvara znamenku tipa 'int' u znamenku tipa 'char', npr. 1 u '1'
  22. char intToChar(int digit) {
  23.   return digit + ZERO_CHAR;
  24. }
  25.  
  26. // Prima neki string i trazenu duljinu i dodaje nule na pocetak zadanog stringa tako da na kraju bude zadane duljine. Ovo se radi iz razloga da se dva broja razlicite duljine mogu poravnati, kao kad se zbraja na papiru jedan iznad drugoga.
  27. void padString(char *string, int length) {
  28.   int currentLength = strlen(string);
  29.   int padLength = length - currentLength;
  30.   // pomice string u memoriji za padLength mjesta u desno
  31.   memmove(string + padLength, string, currentLength + 1);
  32.  
  33.   // nakon pomicanja stringa na ta prva mjesta dodaje nule
  34.   int i;
  35.   for(i = 0; i < padLength; i++) {
  36.     string[i] = ZERO_CHAR;
  37.   }
  38. }
  39.  
  40. // Zbraja dva broja koji su predstavljeni kao polje charactera (jer se takvi ucitaji s tipkovnice)
  41. char *add(char *number1, char *number2) {
  42.   // izracunava koliko koji broj ima znamenki
  43.   int number1Length = strlen(number1);
  44.   int number2Length = strlen(number2);
  45.   int maxLength = max(number1Length, number2Length);
  46.  
  47.   // dodaje odredjeni broj nula na pocetak brojeva tako da budu iste duljine (u biti se samo onom broju s manje znamenki dodaju nule, ali se ovdje funkcija poziva za oba broja, onom koji je vec dobre duljine se nece nista dogoditi a onaj kraci ce dobiti nule na pocetku)
  48.   padString(number1, maxLength);
  49.   padString(number2, maxLength);
  50.  
  51.   // kreira se polje u koje ce se spremati rezultat s tim da se dodaje jos 1 mjesto za preljev i 1 za termination character \0
  52.   char *result = (char*) malloc(maxLength + 2);
  53.   // termination character se mora staviti da se oznaci kraj stringa
  54.   result[maxLength] = TERMINATION_CHAR;
  55.  
  56.   // obavlja se zbrajanje kao na papiru s desna na lijevo i prenosi se carry na lijevo. Svaka se znamenka s funkcijom charToInt pretvara u integer tako da se mogu zbrojiti
  57.   int carry = 0; int sum;
  58.   int i;
  59.   for(i = maxLength - 1; i >= 0; i--) {
  60.     sum = carry + charToInt(number1[i]) + charToInt(number2[i]);
  61.     // rezultat se opet pretvara u character
  62.     result[i] = intToChar(sum % 10);
  63.     // ovo je visak koji se prenosi u sljedeci korak
  64.     carry = sum / 10;
  65.   }
  66.  
  67.   // ovdje se jos provjerava je li bilo viska kod zbrajanje zadnje 2 znamenke (one krajnje lijevo)
  68.   if(carry > 0) {
  69.    // ako da rezultat se u memoriji pomice za jedno mjesto u desno
  70.     memmove(result + 1, result, strlen(result) + 1);
  71.    // i upisuje se taj visak
  72.     result[0] = intToChar(carry);
  73.   }
  74.  
  75.   return result;
  76. }
  77.  
  78. int main() {
  79.   char number1[MAX_DIGITS];
  80.   char number2[MAX_DIGITS];
  81.  
  82.    // ucitava brojeva kao stringove
  83.   scanf("%s", number1);
  84.   scanf("%s", number2);
  85.  
  86.   // izracuna i ispise rezultat
  87.   char *result = add(number1, number2);
  88.   printf("%s", result);
  89.  
  90.   return 0;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement