Рекурсия для нахождения всех делителей массива чисел - C (СИ)
Формулировка задачи:
Привет всем! Прошу о помощи. Нужно исправить ошибку. Пишу рекурсию для нахождения всех делителей массива чисел. Вот код:
...НО после вывода всего нужного на экран я все еще прохожу и делю не введенные больше числа, делю мусор до тех пор пока компилятор не говорит, ну всё харош, сколько можно, стек переполняется и т д. Правда говоря для некоторых данных, оно работает вполне удовлетворительно. Как это исправить? Благодарю за любую подсказку или за направление в нужную сторону.
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define K 100
int func(int *arr, int quantity, int start);
int j = 0;
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
printf ("Введите числа:\t");
int arr[K];
int i;
for (i = 0; i< K; i++)
if(!scanf("%d", &arr[i])) break;
int quantity = i;
j = func(arr, quantity, 2);
printf ("\nRecursion repeated %d times\n", j);
getch();
}
// моя лихая рекурсия
int func(int *arr, int quantity, int start)
{
j++; // подсчет кол-во итераций
if (start == *arr){ // если потенциальный делитель равен элементу
printf ("%d.\n",start); // то он последний (вывожу его)
++arr; //беру следующее число
--quantity;
func(arr, quantity, 2);
}
if (arr > arr + quantity-1) { // если уже все элементы перебрались,то
return j; // возвращаю количество вхождений в функцию и стало бы сюда больше не возвращаюсь, НО .... (см. вопрос ниже)
}
//if (start > *arr) func( arr, quantity, 3);
if (*arr % start == 0) { //если делитель
printf("%d x ",start); // вывожу его
*arr /=start;
func( arr, quantity, start);
}
else { // иначе
if (start > *arr){ //если мой старт совсем уж не потенциальный делитель, (вдруг ввели единицу) смысл двигаться, остановлю все это дело
return j;
}
func( arr, quantity, start+1); // иначе запущу функцию для следующего потенциального делителя
}
}Решение задачи: «Рекурсия для нахождения всех делителей массива чисел»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
inline void
dividers(int n)
{
int i = 2;
while(i <= n / 2){
if(n % i == 0){
printf("%i ", i);
}
++i;
}
putchar('\n');
return;
}
void
array_dividers(int * a, const int size)
{
static int i = 0;
if(i >= size){
return;
} else{
printf("number: %i\ndividers: ", *a);
dividers(*a);
++i;
array_dividers(a + 1, size);
--i;
}
return;
}
int
main(int argc, char ** argv)
{
int a[] = {10, 15, 48, 36};
array_dividers(a, 4);
exit(EXIT_SUCCESS);
}
Объяснение кода листинга программы
В данном коде рекурсивно находят все делители для каждого числа в массиве.
- Включают необходимые заголовочные файлы
- Определяют две функции: dividers и array_dividers
- Внутри функции dividers происходит поиск делителей числа n с помощью цикла while
- В функции array_dividers происходит рекурсивный обход массива чисел a с помощью указателя a, размер массива size и счетчика i, который отслеживает текущий индекс
- В основной функции main создается массив a и вызывается функция array_dividers для этого массива
- Программа успешно завершается с выводом всех делителей для каждого числа в массиве