Advertisement
Guest User

(A+B)long

a guest
Oct 24th, 2014
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.82 KB | None | 0 0
  1. /*
  2.  * 103.c
  3.  *
  4.  *  Created on: 25 ะพะบั‚. 2014 ะณ.
  5.  *      Author: ulgish
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include <stdlib.h>
  11.  
  12. #define MAX(A,B) ((A)>(B)?(A):(B))
  13. #define MIN(A,B) ((A)<(B)?(A):(B))
  14.  
  15. typedef unsigned char byte;
  16.  
  17. typedef struct{
  18.     byte* val;
  19.     int size;
  20. }number;
  21.  
  22. number* number_create(const char* s){
  23.     number* ret = (number*) malloc(sizeof(number));
  24.     ret->size = strlen(s);
  25.     ret->val = (byte*) calloc(ret->size, sizeof(byte));
  26.     int i;
  27.     for (i = 0; i < ret->size; i++){
  28.         ret->val[ret->size-1-i] = s[i]-48;
  29.     }
  30.     return ret;
  31. }
  32.  
  33. number* number_sum(number* a, number* b){
  34.     number* ret = (number*) malloc(sizeof(number));
  35.     ret->size = MAX(a->size, b->size) + 1;
  36.     ret->val = (byte*) calloc(ret->size, sizeof(byte));
  37.     int i;
  38.     byte carry = 0;
  39.     int min_len = MIN(a->size, b->size);
  40.     for (i = 0; i < min_len; i++){
  41.         ret->val[i] = (a->val[i] + b->val[i] + carry)%10;
  42.         carry = (a->val[i] + b->val[i] + carry)/10;
  43.     }
  44.     number* tmp = a;
  45.     if (a->size < b->size){
  46.         tmp = b;
  47.     }
  48.     if (a->size != b->size)
  49.     while(i < (ret->size -1)){
  50.         ret->val[i] = (tmp->val[i] + carry)%10;
  51.         carry = (tmp->val[i] + carry)/10;
  52.         i++;
  53.     }
  54.     ret->val[ret->size-1] = carry;
  55.     return ret;
  56. }
  57.  
  58. void number_print(number* a){
  59.     int i = a->size - 1;
  60.     while (i >= 0 && !(a->val[i])){
  61.         i--;
  62.     }
  63.     if (i < 0){
  64.         printf("0");
  65.     }else{
  66.         int len = i+1;
  67.         char* s = (char*) calloc(len+1, sizeof(char));
  68.         int j = 0;
  69.         while (j < len){
  70.             s[j] = (char)(a->val[len-1-j]+48);
  71.             j++;
  72.         }
  73.         s[len] = '\0';
  74.         printf("%s", s);
  75.     }
  76. }
  77.  
  78. int main(){
  79.     char sa[101], sb[102];
  80.     freopen("input.txt", "r", stdin);
  81.     freopen("output.txt", "w", stdout);
  82.     scanf("%s %s", sa, sb);
  83.     number* a = number_create(sa);
  84.     number* b = number_create(sb);
  85.     number* c = number_sum(a,b);
  86.     number_print(c);
  87.     printf("\n");
  88.     return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement