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