Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #define MAX_DIGITS 500
- #define ZERO_CHAR '0'
- #define TERMINATION_CHAR '\0'
- // Prima 2 broja i vraca veci
- int max(int first, int second) {
- if (first > second)
- return first;
- return second;
- }
- // Pretvara znamenku tipa 'char' u znamenku tipa 'int', npr. '1' u 1
- int charToInt(char digit) {
- return digit - ZERO_CHAR;
- }
- // Pretvara znamenku tipa 'int' u znamenku tipa 'char', npr. 1 u '1'
- char intToChar(int digit) {
- return digit + ZERO_CHAR;
- }
- // 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.
- void padString(char *string, int length) {
- int currentLength = strlen(string);
- int padLength = length - currentLength;
- // pomice string u memoriji za padLength mjesta u desno
- memmove(string + padLength, string, currentLength + 1);
- // nakon pomicanja stringa na ta prva mjesta dodaje nule
- int i;
- for(i = 0; i < padLength; i++) {
- string[i] = ZERO_CHAR;
- }
- }
- // Zbraja dva broja koji su predstavljeni kao polje charactera (jer se takvi ucitaji s tipkovnice)
- char *add(char *number1, char *number2) {
- // izracunava koliko koji broj ima znamenki
- int number1Length = strlen(number1);
- int number2Length = strlen(number2);
- int maxLength = max(number1Length, number2Length);
- // 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)
- padString(number1, maxLength);
- padString(number2, maxLength);
- // 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
- char *result = (char*) malloc(maxLength + 2);
- // termination character se mora staviti da se oznaci kraj stringa
- result[maxLength] = TERMINATION_CHAR;
- // 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
- int carry = 0; int sum;
- int i;
- for(i = maxLength - 1; i >= 0; i--) {
- sum = carry + charToInt(number1[i]) + charToInt(number2[i]);
- // rezultat se opet pretvara u character
- result[i] = intToChar(sum % 10);
- // ovo je visak koji se prenosi u sljedeci korak
- carry = sum / 10;
- }
- // ovdje se jos provjerava je li bilo viska kod zbrajanje zadnje 2 znamenke (one krajnje lijevo)
- if(carry > 0) {
- // ako da rezultat se u memoriji pomice za jedno mjesto u desno
- memmove(result + 1, result, strlen(result) + 1);
- // i upisuje se taj visak
- result[0] = intToChar(carry);
- }
- return result;
- }
- int main() {
- char number1[MAX_DIGITS];
- char number2[MAX_DIGITS];
- // ucitava brojeva kao stringove
- scanf("%s", number1);
- scanf("%s", number2);
- // izracuna i ispise rezultat
- char *result = add(number1, number2);
- printf("%s", result);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement