that_one_nigga_you_k

soma e multi juntos

Nov 8th, 2023 (edited)
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.87 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. void soma(char *num, char *nam, char *result){
  6.  
  7.     int loopMax, loopMin;
  8.  
  9.     int carry = 0;
  10.  
  11.     int len1 = strlen(num);
  12.     int len2 = strlen(nam);
  13.  
  14.     loopMax = (len1 > len2) ? len1 : len2;
  15.     loopMin = (len1 > len2) ? len2 : len1;
  16.  
  17.     for(int i = 0; i < loopMax; i++){
  18.         int digit1 = (i < len1) ? num[len1 - i - 1] - '0' : 0;
  19.         int digit2 = (i < len2) ? nam[len2 - i - 1] - '0' : 0;
  20.         int sum = digit1 + digit2 + carry;
  21.  
  22.         carry = sum/10;
  23.         result[i] = (sum%10) + '0';
  24.     }
  25.  
  26.     if (carry > 0) {
  27.         result[loopMax] = carry + '0';  // quando a soma de uma casa é maior que 10
  28.         result[loopMax + 1] = '\0';     // o fim da string
  29.     } else {
  30.         result[loopMax] = '\0';         // fim da string quando a soma não é maior q 10
  31.     }
  32.  
  33.     // Reverse the result
  34.     int resultLen = strlen(result);
  35.     for (int i = 0, j = resultLen - 1; i < j; i++, j--) {
  36.         char temp = result[i];
  37.         result[i] = result[j];
  38.         result[j] = temp;
  39.     }
  40.  
  41.     printf("\nResult: %s\n", result);
  42.  
  43. }
  44.  
  45. void multiplica(char *num1, char *num2, char *result){
  46.  
  47.     int len1 = strlen(num1);
  48.     int len2 = strlen(num2);
  49.     int carry;
  50.  
  51.     // numero com todos os zeros
  52.     for (int i = 0; i < len1 + len2; i++) {
  53.         result[i] = '0';
  54.     }
  55.     result[len1 + len2] = '\0';
  56.  
  57.     for (int i = len1 - 1; i >= 0; i--) {
  58.         int num1Digit = num1[i] - '0';
  59.         carry = 0;
  60.  
  61.         for (int j = len2 - 1; j >= 0; j--) {
  62.             int num2Digit = num2[j] - '0';
  63.             int product = (result[i + j + 1] - '0') + (num1Digit * num2Digit) + carry; //onde ele vê o valor daquela casa decimal
  64.             carry = product / 10;
  65.             result[i + j + 1] = (product % 10) + '0';
  66.         }
  67.  
  68.         result[i] += carry;
  69.     }
  70.  
  71.     // promeiro numero não-zero
  72.     int start = 0;
  73.     while (result[start] == '0' && result[start + 1] != '\0') {
  74.         start++;
  75.     }
  76.  
  77.     printf("\nResult: %s\n", result + start);
  78. }
  79.  
  80. int main(){
  81.     char *num1, *num2, *result;
  82.     int carry = 0;
  83.  
  84.     num1 = (char*)malloc(100000000 * sizeof(char));
  85.     num2 = (char*)malloc(100000000 * sizeof(char));
  86.     result = (char*)malloc(200000001 * sizeof(char));
  87.  
  88.     if (num1 == NULL || num2 == NULL || result == NULL) {
  89.         printf("Alocação falhou\n");
  90.         return 1;
  91.     }
  92.  
  93.     printf("Digite o primeiro número: ");
  94.     scanf(" %[^\n]s", num1);
  95.     printf("Digite o segundo número: ");
  96.     scanf(" %[^\n]s", num2);
  97.  
  98.     int opc;
  99.  
  100.     printf("-------1 para soma-------\n------2 para multiplicar------\n");
  101.     scanf("%d", &opc);
  102.  
  103.     if(opc == 1){
  104.         soma(num1, num2, result);
  105.     }
  106.     else{
  107.         multiplica(num1, num2, result);
  108.     }
  109.  
  110.     free(num1);
  111.     free(num2);
  112.     free(result);
  113.  
  114.     return(0);
  115. }
Add Comment
Please, Sign In to add comment