Advertisement
Guest User

project 3 by HIT

a guest
Jan 19th, 2020
541
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.92 KB | None | 0 0
  1. //
  2. //  main.c
  3. //  Assigend_3
  4. //
  5. //  Created by yarin ben baruch on 07/01/2020.
  6. //  Copyright © 2020 yarin ben baruch. All rights reserved.
  7. //
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #define _CRT_NONSTDC_NO_DEPRECATE
  13.  
  14. typedef char* verylong;
  15. verylong input_long(void);
  16. verylong add_verylong(verylong vl1, verylong vl2);
  17. verylong multiply_verylong(verylong vl1, verylong vl2);
  18.  
  19.  
  20. void main(void)
  21. {
  22.     verylong a, b, c;
  23.  
  24.     do {
  25.         printf("enter the first long integer: ");
  26.         a = input_long();
  27.     } while (!a);
  28.  
  29.     do {
  30.  
  31.         printf("enter the second long integer: ");
  32.         b = input_long();
  33.     } while (!b);
  34.  
  35.     c = add_verylong(a, b);
  36.     printf("%s + %s = %s\n", a, b, c);
  37.  
  38.  
  39.     c = multiply_verylong(a, b); printf("%s * %s = %s\n", a, b, c);
  40.     free(c);
  41.     free(a);
  42.     free(b);
  43. }
  44.  
  45. verylong input_long(void)
  46. {
  47.     char tempstr[80];
  48.     verylong longnum;
  49.     int i = 0;
  50.  
  51.     longnum = (verylong)malloc((strlen(tempstr) + 1));
  52.  
  53.     gets(tempstr);
  54.  
  55.     while (tempstr[i] != '\0')
  56.     {
  57.         if (tempstr[i] < '0' || tempstr[i] > '9')
  58.         {
  59.             printf("Erorr,try again \n");
  60.             return NULL;
  61.         }
  62.         i++;
  63.     }
  64.  
  65.     strcpy(longnum, tempstr);
  66.  
  67.     return longnum;
  68. }
  69.  
  70.  
  71. verylong add_verylong(verylong vl1, verylong vl2)
  72. {
  73.     int i, carry = 0;
  74.     int a, b, num;
  75.     int size;
  76.     int S_vl1 = strlen(vl1);
  77.     int S_vl2 = strlen(vl2);
  78.     int size_arr = (S_vl2 >= S_vl1 ? S_vl2 : S_vl1) + 1;
  79.  
  80.     verylong sum_arr = (verylong)calloc(size_arr + 1, sizeof(char));
  81.  
  82.     sum_arr[size_arr] = '\0';
  83.     size = size_arr - 1;
  84.  
  85.  
  86.     for (i = 0; i < size; i++)
  87.     {
  88.         a = vl1[S_vl1 - 1] - '0';
  89.         b = vl2[S_vl2 - 1] - '0';
  90.  
  91.         if (S_vl1 - 1 < 0)
  92.             a = 0;
  93.  
  94.         if (S_vl2 - 1 < 0)
  95.             b = 0;
  96.  
  97.         num = a + b + carry;
  98.         carry = num <= 9 ? 0 : 1;
  99.         sum_arr[size_arr - 1] = (num <= 9 ? num : num % 10) + '0';
  100.  
  101.         size_arr--;
  102.         S_vl1--;
  103.         S_vl2--;
  104.     }
  105.  
  106.     if (carry == 1)
  107.         sum_arr[0] = '1';
  108.     else
  109.         sum_arr++;
  110.  
  111.     return sum_arr;
  112.  
  113. }
  114.  
  115.  
  116. verylong multiply_verylong(verylong vl1, verylong vl2)
  117. {
  118.     int i = 0;
  119.     int j = 0;
  120.     int len1 = strlen(vl1);
  121.     int len2 = strlen(vl2);
  122.     int* result = (int*)calloc(len1 + len2, sizeof(int));
  123.     int indexr1 = 0, indexr2 = 0;
  124.     int carry;
  125.     int n1;
  126.     int n2;
  127.     int sum;
  128.     int z;
  129.     for (i = len1 - 1; i >= 0; i--)
  130.     {
  131.         carry = 0;
  132.         n1 = vl1[i] - '0';
  133.  
  134.         indexr2 = 0;
  135.  
  136.         for (j = len2 - 1; j >= 0; j--)
  137.         {
  138.             n2 = vl2[j] - '0';
  139.  
  140.             sum = n1 * n2 + result[indexr1 + indexr2] + carry;
  141.  
  142.             carry = sum / 10;
  143.  
  144.             result[indexr1 + indexr2] = sum % 10;
  145.  
  146.             indexr2++;
  147.         }
  148.  
  149.         if (carry > 0)
  150.             result[indexr1 + indexr2] += carry;
  151.         indexr1++;
  152.     }
  153.     z = len1 + len2;
  154.  
  155.     while (z >= 0 && result[z - 1] == 0)
  156.         z--;
  157.     verylong longnum = (verylong)malloc(z + 1);
  158.     if (z == 0) {
  159.         longnum = (verylong)realloc(longnum, 2);
  160.         longnum[0] = '0';
  161.         longnum[1] = '\0';
  162.         return longnum;
  163.     }
  164.     longnum[z] = '\0';
  165.     z = z - 1;
  166.     for (i = 0; z >= 0, longnum[i] != '\0'; i++, z--)
  167.     {
  168.         longnum[i] = result[z] + '0';
  169.     }
  170.     return longnum;
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement