Advertisement
Guest User

Untitled

a guest
Dec 3rd, 2016
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.38 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <limits.h>
  5. long int indecimal(long int n);
  6. long int indecimal(long int n)
  7. {
  8.     long int x = 0;
  9.     int f, i = 0;
  10.     if (n >= 0)
  11.         f = 1;
  12.     else f = -1;
  13.     while (abs(n) > 0)
  14.     {
  15.         x = x + (abs(n) % 10) * pow(3, i);
  16.         n = n / 10;
  17.         i++;
  18.     }
  19.     x = x * f;
  20.     return x;
  21. }
  22. long int internary(long int n);
  23. long int internary(long int n)
  24. {
  25.     long int x = 0;
  26.     int f, i  = 1;
  27.     if (n >= 0)
  28.         f = 1;
  29.     else f = -1;
  30.     while (abs(n) > 0)
  31.     {
  32.         x = x + (abs(n) % 3) * i;
  33.         n = n / 3;
  34.         i *= 10;
  35.     }
  36.     x = x * f;
  37.     return x;
  38. }
  39. int summ(long int a, long int b, long int *sum);
  40. int summ(long int a, long int b, long int *sum)
  41. {
  42.   if (LONG_MAX - abs(a) >= b)
  43.   //если "a" будет отрицательным, то произойдет переполнение, поэтому abs(a);;
  44.   //eсли написать еще одно условие LONG_MIN - a <= b, то произойдет переполнение в отрицательную сторону
  45.   //можно вообще не писать это условие, я думаю, скажешь ему это, если что
  46.     {
  47.       *sum = internary(indecimal(b) + indecimal(a));
  48.       return 0;
  49.     }
  50.     else return 1;
  51. }
  52. int def(long int a, long int b, long int *dif);
  53. int def(long int a, long int b, long int *dif)
  54. {
  55.   if (LONG_MIN + abs(b) <= a)
  56.     // аналогично ситуации в функции summ;;
  57.   {
  58.     *dif = internary(indecimal(a) - indecimal(b));
  59.     return 0;
  60.   }
  61.   else return 1;
  62. }
  63. int proizvedenie(long int a, long int b, long int *pr);
  64. int proizvedenie(long int a, long int b, long int *pr)
  65. {
  66.   if ( (LONG_MAX/abs(b) >= a) && (LONG_MIN/abs(b) <= a) )
  67.   {
  68.     *pr = internary(indecimal(a) * indecimal(b));
  69.     return 0;
  70.   }
  71.   else return 1;
  72. }
  73. int stepen(long int a, long int b, long int *st);
  74. int stepen(long int a, long int b, long int *st)
  75. {
  76.   if ( (b > 0) && (pow(LONG_MAX, 1.0/b) >= (double)a) )
  77.   {
  78.     *st = internary((pow(indecimal(a), indecimal(b))));
  79.     return 0;
  80.   }
  81.   else return 1;
  82. }
  83. int main()
  84. {
  85.     long int a , b , sum, dif, pr, st, x, y, pr1, dif1, dif2, k = 0;
  86.     scanf("%ld %ld", &a, &b );
  87.     if (summ(a,  b, &sum) == 1)
  88.       printf("Переполнение при сложении двух чисел\n");
  89.     else
  90.         {
  91.             k++;
  92.             printf("%ld\n", sum);
  93.         }
  94.     if (def(a, b, &dif) == 1)
  95.       printf("Переполнение при вычитании двух чисел\n");
  96.     else
  97.         {
  98.             k++;   
  99.             printf("%ld\n", dif);
  100.         }
  101.     if (proizvedenie(a, b, &pr) == 1)
  102.       printf("Переполнение при умножении двух чисел\n");
  103.     else
  104.         {
  105.             k++;
  106.             printf("%ld\n", pr);
  107.         }
  108.     if (stepen(a, b, &st) == 1)
  109.       printf("Переполнение при возведении в степень\n");
  110.     else
  111.         {
  112.             k++;
  113.             printf("%ld\n", st);
  114.         }
  115.     if (k < 4) printf("Переполение в одной или нескольких из функций");
  116.         else
  117.         {
  118.             stepen(a, 2, &st);
  119.             proizvedenie(st, b, &pr);
  120.             def(a, b, &dif);
  121.             proizvedenie(a, dif, &pr1);
  122.             def(pr, pr1, &dif2);
  123.             summ(dif2, a, &sum);
  124.             printf("%ld\n", sum);
  125.         }
  126.     return 0;
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement