Переделать один из циклов на рекурсию - 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
- Вычисление произведения соответствующих символов
- Печать полученного произведения
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д