Переделать один из циклов на рекурсию - C (СИ)
Формулировка задачи:
Помогите пожалуйста розобраться в коде и переделать один из циклов на рекурсию.
#include<stdio.h>
#include<math.h>
#include <conio.h>
#define MAX 10000
char* Multipty(char [],char[]);
int main()
{
char a[MAX];
char b[MAX];
printf("Enter a: ");
scanf("%s", a);
printf("Enter b: ");
scanf("%s", b);
printf("\na * b = %s\n", Multipty(a, b));
getch();
return 0;
}
char* Multipty(char a[], char b[])
{
static char result[MAX];
char c[MAX];
char temp[MAX];
int la, lb;
int i, j, k = 0, x = 0, y;
long int r = 0;
long sum = 0;
for (i = 0; a[i] != '\0'; i++)
{
la = i;
}
for (j = 0; b[j] != '\0'; j++)
lb = j;
for(i = 0; i <= la; i++)
{
a[i] = a[i] - 48;
}
for(i = 0; i <= lb; i++)
{
b[i] = b[i] - 48;
}
for(i = lb; i >= 0; i--)
{
r = 0;
for(j = la; j >= 0; j--)
{
temp[k++] = (b[i] * a[j] + r) % 10;
r = (b[i] * a[j] + r) / 10;
}
temp[k++] = r;
x++;
for(y = 0; y < x; y++)
{
temp[k++] = 0;
}
}
k = 0;
r = 0;
for(i = 0; i < la + lb + 2; i++)
{
sum = 0;
y = 0;
for(j = 1; j <= lb + 1; j++)
{
if(i <= la + j)
{
sum = sum + temp[y+i];
}
y += j + la + 1;
}
c[k++] = (sum + r) % 10;
r = (sum + r) / 10;
}
c[k] = r;
j = 0;
for(i = k - 1; i >= 0; i--)
{
result[j++] = c[i] + 48;
}
result[j] = '\0';
return result;
}Решение задачи: «Переделать один из циклов на рекурсию»
textual
Листинг программы
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <string.h>
#define MAX 10000
char* Multipty(char [],char[]);
/* Рекурсивная процедура вычисления неполного произведения */
int cmult(char *a, char *temp, char b, int k, int j, int *r)
{
if (j < 0)
{
return k;
}
else
{
temp[k++]=(b * a[j] + *r) % 10;
*r= (b * a[j] + *r) / 10;
cmult(a,temp,b,k,j-1,r);
}
}
int main()
{
char a[MAX];
char b[MAX];
printf("Enter a: "); /* ввод первого */
scanf("%s", a);
printf("Enter b: "); /* ввод второго */
scanf("%s", b);
printf("\na * b = %s\n", Multipty(a, b)); /* печать произведения */
getch();
return 0;
}
char* Multipty(char a[], char b[])
{
static char result[MAX];
char c[MAX];
char temp[MAX];
int la, lb;
int i, j, k = 0, x = 0, y;
int r = 0;
long sum = 0;
for (i = 0; a[i] != '\0'; i++) /* определение длины 1-го сомножителя */
la = i;
for (j = 0; b[j] != '\0'; j++) /* определение длины 2-го сомножителя */
lb = j;
for(i = 0; i <= la; i++)
{
a[i] = a[i] - 48; /* из ASCII кодов -> число [0-9] */
}
for(i = 0; i <= lb; i++)
{
b[i] = b[i] - 48; /* из ASCII кодов -> число [0-9] */
}
for(i = lb; i >= 0; i--)
{
r=0;
k=cmult(a,temp,b[i],k,la,&r); /* рекурсивное вычисление неп. произведения */
temp[k++] = r; /* последний перенос */
x++;
for(y = 0; y < x; y++) /* остальные разряды неполного произведения зануляем */
{
temp[k++] = 0;
}
}
/* прибавление очередного неполного произведения */
/* к общему результату */
k = 0;
r = 0;
for(i = 0; i < la + lb + 2; i++)
{
sum = 0;
y = 0;
for(j = 1; j <= lb + 1; j++)
{
if(i <= la + j)
{
sum = sum + temp[y+i];
}
y += j + la + 1;
}
c[k++] = (sum + r) % 10; /* младшая цифра суммы */
r = (sum + r) / 10; /* перенос */
}
c[k] = r;
j = 0;
for(i = k - 1; i >= 0; i--)
{
result[j++] = c[i] + 48; /* перевод из числа в ASCII */
}
result[j] = '\0';
return result;
}
Объяснение кода листинга программы
Код выполняет вычисление произведения двух строк. Задача заключается в том, чтобы переписать один из циклов с использованием рекурсии.
- Переменные:
- a, b: строки, которые нужно перемножить
- MAX: максимальная длина строки
- temp: временный массив для хранения промежуточных результатов
- r: вспомогательная переменная для хранения переносов
- result: результат умножения
- c: массив для хранения разрядов результата
- k: индекс в массиве c
- la, lb: длины строк a и b
- i, j: индексы для обхода строк a и b
- x: количество разрядов в результате
- y: вспомогательный индекс для обхода массива c
- sum: сумма разрядов в текущем неполном произведении
- В функции main() происходит следующее:
- Считывание строк a и b с помощью scanf()
- Вычисление произведения с помощью функции Multipty()
- Печать произведения с помощью printf()
- В функции Multipty() происходит следующее:
- Преобразование символов строк a и b из ASCII в числа
- Рекурсивное вычисление неполного произведения с помощью функции cmult()
- Зануление остальных разрядов неполного произведения
- Прибавление очередного неполного произведения к общему результату
- Перевод результата из числа в ASCII и возврат результата
- В функции cmult() происходит следующее:
- Рекурсивное вычисление неполного произведения
- Если j < 0, то возвращается k
- В противном случае, происходит вычисление следующего разряда и рекурсивный вызов cmult()
- В цикле в функции Multipty() происходит следующее:
- Перебор всех разрядов результата
- Вычисление суммы разрядов текущего неполного произведения
- Добавление младшей цифры суммы к массиву c
- Перенос старших разрядов суммы
- Зануление остальных разрядов результата
- Перевод числа в ASCII и добавление к результату
- В цикле в функции main() происходит следующее:
- Перебор всех символов в строке a
- Считывание соответствующих символов из строки b
- Вычисление произведения соответствующих символов
- Печать полученного произведения