Алгоритм умножения/деления - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Довольно заезженная тема, которую я не могу оставить без внимания Решил, что дефолтных операторов умножения и деления недостаточно, поэтому решил написать собственные функции:
int multiplication( int a, int b )
{
    int res = 0;
 
    if ( b < 0 ) b = -b, a = -a;
    while ( b-- ) res += a;
 
    return res;
}
 
int division( int a, int b )
{
    int res = 0;
 
    if      ( a < 0 && b > 0 )
        while ( a <= -b ) --res, a += b;
 
    else if ( b < 0 && a > 0 )
        while ( a >= -b ) --res, a += b;
 
    else if ( a < 0 && b < 0 )
        while ( a <= b ) ++res, a -= b;
 
    else
        while ( a >= b ) ++res, a -= b;
 
    return res;
}

По делу:

ищу того, кто перепишет мою division, ибо она попахивает P.S.: multiplication тоже не оставляйте без внимания. Кто напишет лучше -- плюсик в коромысло! P.P.S.: Проверку деления на 0 нарочно не сделал. ( так надо )

Решение задачи: «Алгоритм умножения/деления»

textual
Листинг программы
#include <stdio.h>
#include <limits.h>
 
int multyple(int a, int b) {
    if ( b < 0 )
        return multyple(-a, -b);
    else if ( b == 0 )
        return 0;
    else if ( b == 1 )
        return a;
    else
        return ( ( b & 1 ) ? a : 0 ) + multyple(a << 1, b >> 1);
}
 
int divide(int a, int b, int * rem) {
    if ( a < 0 )
        return -divide(-a, b, rem);
    if ( b < 0 )
        return -divide(a, -b, rem);
    else if ( b == 0 ) {
        *rem = INT_MAX;
        return INT_MAX;
    }
    else if ( a == 0 ) {
        *rem = 0;
        return 0;
    }
    else {
        int quot = divide(a >> 1, b, rem);
        quot <<= 1;
        *rem <<= 1;
        if ( a & 1 )
            *rem += 1;
        if ( *rem >= b ) {
            *rem -= b;
            quot += 1;
        }
        return quot;
    }
}
 
int main(void) {
    int a, b, c;
    
    while ( printf("a b: ") && scanf("%d%d", &a, &b) == 2 ) {
        printf("%d x %d = %d\n%d / %d = %d\n", a, b, multyple(a, b), a, b, divide(a, b, &c));
        printf("%d %% %d = %d\n", a, b, c);
    }
    
    return 0;
}

Объяснение кода листинга программы

  1. Включаются заголовочные файлы stdio.h и limits.h
  2. Определяются две функции: multyple и divide
  3. Функция multyple принимает два целых числа a и b и возвращает их произведение.
  4. Если b меньше нуля, функция возвращает результат multyple(-a, -b).
  5. Если b равно нулю, функция возвращает 0.
  6. Если b равно 1, функция возвращает a.
  7. В остальных случаях функция возвращает ( ( b & 1 ) ? a : 0 ) + multyple(a << 1, b >> 1).
  8. Функция divide принимает три целых числа a, b и rem и возвращает частное a/b и остаток rem.
  9. Если a меньше нуля, функция возвращает -divide(-a, b, rem).
  10. Если b меньше нуля, функция возвращает -divide(a, -b, rem).
  11. Если b равно нулю, функция возвращает 0 и устанавливает rem в INT_MAX.
  12. Если a равно нулю, функция возвращает 0 и устанавливает rem в 0.
  13. В остальных случаях функция возвращает int quot, полученный путем деления a на b, увеличенный на 1, и устанавливает rem в остаток от деления.
  14. В функции main считываются два целых числа a и b.
  15. Пока пользователь вводит корректные значения a и b, выводятся результаты умножения и деления a и b, а также остаток от деления.
  16. Возвращается 0, завершая программу.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.733 из 5
Похожие ответы