Алгоритм умножения/деления - 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, завершая программу.