Рекурсия для нахождения всех делителей массива чисел - 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);
}

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

В данном коде рекурсивно находят все делители для каждого числа в массиве.

  1. Включают необходимые заголовочные файлы
  2. Определяют две функции: dividers и array_dividers
  3. Внутри функции dividers происходит поиск делителей числа n с помощью цикла while
  4. В функции array_dividers происходит рекурсивный обход массива чисел a с помощью указателя a, размер массива size и счетчика i, который отслеживает текущий индекс
  5. В основной функции main создается массив a и вызывается функция array_dividers для этого массива
  6. Программа успешно завершается с выводом всех делителей для каждого числа в массиве

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


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

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

10   голосов , оценка 3.9 из 5
Похожие ответы