Как написать код без рекурсии?

Нужно написать программу без рекурсии. Вот сам код:

#include <iostream>
#include <math.h>
using namespace std;

void get(int n);
int main() {
    int n;
    while (1) {
        cout << "Enter a number (0 = exit) and press ENTER: ";
        cin >> n;
        if (n == 0)
            break;
        get(n);
    }
    return 0;
}
void get(int n) {
    double of_n = sqrt(n);
    for(int i = 2; i <= of_n; ++i)
        if (n % i == 0) {
            cout << i << ",";
            get(n / i);
            return;
        }
    cout << n << endl;
}

Написал код без рекурсии но работает немного неправильно. Вот сам код:

#include <iostream>
#include <math.h>
using namespace std;

void get_all(int n);
void get_lowest(int n, int i);
int main() {
    int n;
    while (1) {
        cout << "Enter the number: ";
        cin >> n;
        if (n == 0)
            break;
        get_all(n);
    } 
    return 0;
}
void get_all(int n) {
    double of_n = sqrt(n);
    int i;
    for(i = 2; i <= of_n; ++i)
        if (n % i == 0) {
            cout << i << ", ";
            get_lowest(n, i);
            return;
        }
    cout << n << endl;
}
void get_lowest(int n, int i) {
    cout << n / i << endl;
}

Ответы (1 шт):

Автор решения: nano

Самый простой способ убрать рекурсию:

void get(int n) {
loop:
    double of_n = sqrt(n);
    for (int i = 2; i <= of_n; ++i)
        if (n % i == 0) {
            cout << i << ",";
            n /= i;
            goto loop;
        }
    cout << n << endl;
}

Хоть использование goto не поощряется, но иногда в си это делает код проще и короче.

Вариант без goto:

void get(int n) {
    while (true) {
        double of_n = sqrt(n);
        int i = 2;
        for (; i <= of_n; ++i)
            if (n % i == 0) {
                cout << i << ",";
                n /= i;
                break;
            }

        if (i > of_n) {
            cout << n << endl;
            break;
        }
    }
}
→ Ссылка