Рубрики

Проверьте на целочисленное переполнение

Напишите функцию «C», int addOvf (int * result, int a, int b) Если переполнения нет, функция помещает результирующий = sum a + b в «result» и возвращает 0. В противном случае возвращает -1. Решение о приведении к длинному и добавлении, чтобы найти обнаружение переполнения не допускается.

Способ 1
Переполнение может быть только в том случае, если знаки двух чисел совпадают, а знак суммы противоположен знакам чисел.

1)  Calculate sum
2)  If both numbers are positive and sum is negative then return -1
     Else 
        If both numbers are negative and sum is positive then return -1
        Else return 0

C ++

#include <bits/stdc++.h>

using namespace std;

  
/ * Принимает указатель на результат и два числа как

    аргументы. Если переполнения нет, функция

    помещает результат = сумма a + b в «результат» и

    возвращает 0, в противном случае возвращается -1 * /

int addOvf(int* result, int a, int b) 

    *result = a + b; 

    if(a > 0 && b > 0 && *result < 0) 

        return -1; 

    if(a < 0 && b < 0 && *result > 0) 

        return -1; 

    return 0; 

  
// Код драйвера

int main() 

    int *res = new int[(sizeof(int))]; 

    int x = 2147483640; 

    int y = 10; 

  

    cout<<addOvf(res, x, y); 

  

    cout<<"\n"<<*res; 

    return 0; 

  
// Этот код предоставлен rathbhupendra

С

#include<stdio.h>
#include<stdlib.h>

  
/ * Принимает указатель на результат и два числа как

    аргументы. Если переполнения нет, функция

    помещает результат = сумма a + b в «результат» и

    возвращает 0, в противном случае возвращается -1 * /

 int addOvf(int* result, int a, int b)

 {

     *result = a + b;

     if(a > 0 && b > 0 && *result < 0)

         return -1;

     if(a < 0 && b < 0 && *result > 0)

         return -1;

     return 0;

 }

  

 int main()

 {

     int *res = (int *)malloc(sizeof(int));

     int x = 2147483640;

     int y = 10;

  

     printf("%d", addOvf(res, x, y));

  

     printf("\n %d", *res);

     getchar();

     return 0;

}

Выход:

-1
-2147483646

Сложность времени: O (1)
Космическая сложность: O (1)

Способ 2
Спасибо Himanshu Aggarwal за добавление этого метода. Этот метод не изменяет * результат, если используется переполнение.

C ++

#include <bits/stdc++.h>

using namespace std;

  

int addOvf(int* result, int a, int b) 

    if( a > INT_MAX - b) 

        return -1; 

    else

    

        *result = a + b; 

        return 0; 

    

  

int main() 

    int *res = new int[(sizeof(int))]; 

    int x = 2147483640; 

    int y = 10; 

      

    cout<<addOvf(res, x, y)<<endl; 

    cout<<*res; 

    return 0; 

  
// Этот код предоставлен rathbhupendra

С

#include<stdio.h>
#include<limits.h>
#include<stdlib.h>

  

int addOvf(int* result, int a, int b)

{

   if( a > INT_MAX - b)

     return -1;

   else

   {

     *result = a + b;

      return 0;

   }

}

  

int main()

{

  int *res = (int *)malloc(sizeof(int));

  int x = 2147483640;

  int y = 10;

  

  printf("%d", addOvf(res, x, y));

  printf("\n %d", *res);

  getchar();

  return 0;

}

Выход:

-1
0


Сложность времени:
O (1)
Космическая сложность: O (1)

Пожалуйста, пишите комментарии, если вы обнаружите какую-либо ошибку в приведенных выше кодах / алгоритмах, или найдете другие способы решения той же проблемы.

Рекомендуемые посты:

Проверьте на целочисленное переполнение

0.00 (0%) 0 votes