Алгоритм умножения/деления - 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; }
Объяснение кода листинга программы
- Включаются заголовочные файлы stdio.h и limits.h
- Определяются две функции: multyple и divide
- Функция multyple принимает два целых числа a и b и возвращает их произведение.
- Если b меньше нуля, функция возвращает результат multyple(-a, -b).
- Если b равно нулю, функция возвращает 0.
- Если b равно 1, функция возвращает a.
- В остальных случаях функция возвращает ( ( b & 1 ) ? a : 0 ) + multyple(a << 1, b >> 1).
- Функция divide принимает три целых числа a, b и rem и возвращает частное a/b и остаток rem.
- Если a меньше нуля, функция возвращает -divide(-a, b, rem).
- Если b меньше нуля, функция возвращает -divide(a, -b, rem).
- Если b равно нулю, функция возвращает 0 и устанавливает rem в INT_MAX.
- Если a равно нулю, функция возвращает 0 и устанавливает rem в 0.
- В остальных случаях функция возвращает int quot, полученный путем деления a на b, увеличенный на 1, и устанавливает rem в остаток от деления.
- В функции main считываются два целых числа a и b.
- Пока пользователь вводит корректные значения a и b, выводятся результаты умножения и деления a и b, а также остаток от деления.
- Возвращается 0, завершая программу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д