Переделать один из циклов на рекурсию - C (СИ)

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

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

Помогите пожалуйста розобраться в коде и переделать один из циклов на рекурсию.
Листинг программы
  1. #include<stdio.h>
  2. #include<math.h>
  3. #include <conio.h>
  4. #define MAX 10000
  5. char* Multipty(char [],char[]);
  6. int main()
  7. {
  8. char a[MAX];
  9. char b[MAX];
  10. printf("Enter a: ");
  11. scanf("%s", a);
  12. printf("Enter b: ");
  13. scanf("%s", b);
  14. printf("\na * b = %s\n", Multipty(a, b));
  15. getch();
  16. return 0;
  17. }
  18. char* Multipty(char a[], char b[])
  19. {
  20. static char result[MAX];
  21. char c[MAX];
  22. char temp[MAX];
  23. int la, lb;
  24. int i, j, k = 0, x = 0, y;
  25. long int r = 0;
  26. long sum = 0;
  27. for (i = 0; a[i] != '\0'; i++)
  28. {
  29. la = i;
  30. }
  31. for (j = 0; b[j] != '\0'; j++)
  32. lb = j;
  33. for(i = 0; i <= la; i++)
  34. {
  35. a[i] = a[i] - 48;
  36. }
  37. for(i = 0; i <= lb; i++)
  38. {
  39. b[i] = b[i] - 48;
  40. }
  41. for(i = lb; i >= 0; i--)
  42. {
  43. r = 0;
  44. for(j = la; j >= 0; j--)
  45. {
  46. temp[k++] = (b[i] * a[j] + r) % 10;
  47. r = (b[i] * a[j] + r) / 10;
  48. }
  49. temp[k++] = r;
  50. x++;
  51. for(y = 0; y < x; y++)
  52. {
  53. temp[k++] = 0;
  54. }
  55. }
  56. k = 0;
  57. r = 0;
  58. for(i = 0; i < la + lb + 2; i++)
  59. {
  60. sum = 0;
  61. y = 0;
  62. for(j = 1; j <= lb + 1; j++)
  63. {
  64. if(i <= la + j)
  65. {
  66. sum = sum + temp[y+i];
  67. }
  68. y += j + la + 1;
  69. }
  70. c[k++] = (sum + r) % 10;
  71. r = (sum + r) / 10;
  72. }
  73. c[k] = r;
  74. j = 0;
  75. for(i = k - 1; i >= 0; i--)
  76. {
  77. result[j++] = c[i] + 48;
  78. }
  79. result[j] = '\0';
  80. return result;
  81. }

Решение задачи: «Переделать один из циклов на рекурсию»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <conio.h>
  4. #include <string.h>
  5.  
  6. #define MAX 10000
  7.  
  8. char* Multipty(char [],char[]);
  9.  
  10. /* Рекурсивная процедура вычисления неполного произведения */
  11.  
  12. int cmult(char *a, char *temp, char b, int k, int j, int *r)
  13. {
  14.      if (j < 0)
  15.      {
  16.         return k;
  17.      }
  18.      else
  19.         {
  20.            temp[k++]=(b * a[j] + *r) % 10;
  21.            *r= (b * a[j] + *r) / 10;
  22.            cmult(a,temp,b,k,j-1,r);
  23.         }
  24.  
  25. }
  26.  
  27. int main()
  28. {
  29.  
  30.     char a[MAX];
  31.     char b[MAX];
  32.  
  33.     printf("Enter a: "); /* ввод первого */
  34.     scanf("%s", a);
  35.  
  36.     printf("Enter b: "); /* ввод второго */
  37.     scanf("%s", b);
  38.  
  39.     printf("\na * b = %s\n", Multipty(a, b)); /* печать произведения */
  40.  
  41.     getch();
  42.     return 0;
  43. }
  44.  
  45. char* Multipty(char a[], char b[])
  46. {
  47.     static char result[MAX];
  48.     char c[MAX];
  49.     char temp[MAX];
  50.     int la, lb;
  51.     int i, j, k = 0, x = 0, y;
  52.     int r = 0;
  53.     long sum = 0;
  54.  
  55.     for (i = 0; a[i] != '\0'; i++)  /* определение длины 1-го сомножителя */
  56.         la = i;
  57.  
  58.     for (j = 0; b[j] != '\0'; j++) /* определение длины 2-го сомножителя */
  59.         lb = j;
  60.  
  61.     for(i = 0; i <= la; i++)
  62.     {
  63.         a[i] = a[i] - 48;           /* из ASCII кодов -> число [0-9] */
  64.     }
  65.     for(i = 0; i <= lb; i++)
  66.     {
  67.         b[i] = b[i] - 48;          /* из ASCII кодов -> число [0-9] */
  68.     }
  69.  
  70.     for(i = lb; i >= 0; i--)
  71.     {
  72.  
  73.         r=0;
  74.  
  75.         k=cmult(a,temp,b[i],k,la,&r);  /*  рекурсивное вычисление неп. произведения */     
  76.  
  77.         temp[k++] = r;                 /* последний перенос */
  78.         x++;
  79.  
  80.         for(y = 0; y < x; y++)         /* остальные разряды неполного произведения зануляем */
  81.         {
  82.             temp[k++] = 0;
  83.         }
  84.     }
  85.  
  86.     /* прибавление очередного неполного произведения */
  87.     /* к общему результату */
  88.  
  89.     k = 0;
  90.     r = 0;
  91.     for(i = 0; i < la + lb + 2; i++)
  92.     {
  93.         sum = 0;
  94.         y = 0;
  95.         for(j = 1; j <= lb + 1; j++)
  96.         {
  97.             if(i <= la + j)
  98.             {
  99.                 sum = sum + temp[y+i];
  100.             }
  101.             y += j + la + 1;
  102.         }
  103.  
  104.         c[k++] = (sum + r) % 10; /* младшая цифра суммы */
  105.         r = (sum + r) / 10;          /* перенос */
  106.     }
  107.  
  108.     c[k] = r;
  109.     j = 0;
  110.     for(i = k - 1; i >= 0; i--)
  111.     {
  112.         result[j++] = c[i] + 48;  /* перевод из числа в ASCII */
  113.     }
  114.     result[j] = '\0';
  115.  
  116.     return result;
  117. }

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

Код выполняет вычисление произведения двух строк. Задача заключается в том, чтобы переписать один из циклов с использованием рекурсии.

  1. Переменные:
    • a, b: строки, которые нужно перемножить
    • MAX: максимальная длина строки
    • temp: временный массив для хранения промежуточных результатов
    • r: вспомогательная переменная для хранения переносов
    • result: результат умножения
    • c: массив для хранения разрядов результата
    • k: индекс в массиве c
    • la, lb: длины строк a и b
    • i, j: индексы для обхода строк a и b
    • x: количество разрядов в результате
    • y: вспомогательный индекс для обхода массива c
    • sum: сумма разрядов в текущем неполном произведении
  2. В функции main() происходит следующее:
    • Считывание строк a и b с помощью scanf()
    • Вычисление произведения с помощью функции Multipty()
    • Печать произведения с помощью printf()
  3. В функции Multipty() происходит следующее:
    • Преобразование символов строк a и b из ASCII в числа
    • Рекурсивное вычисление неполного произведения с помощью функции cmult()
    • Зануление остальных разрядов неполного произведения
    • Прибавление очередного неполного произведения к общему результату
    • Перевод результата из числа в ASCII и возврат результата
  4. В функции cmult() происходит следующее:
    • Рекурсивное вычисление неполного произведения
    • Если j < 0, то возвращается k
    • В противном случае, происходит вычисление следующего разряда и рекурсивный вызов cmult()
  5. В цикле в функции Multipty() происходит следующее:
    • Перебор всех разрядов результата
    • Вычисление суммы разрядов текущего неполного произведения
    • Добавление младшей цифры суммы к массиву c
    • Перенос старших разрядов суммы
    • Зануление остальных разрядов результата
    • Перевод числа в ASCII и добавление к результату
  6. В цикле в функции main() происходит следующее:
    • Перебор всех символов в строке a
    • Считывание соответствующих символов из строки b
    • Вычисление произведения соответствующих символов
    • Печать полученного произведения

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


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

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

9   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы