Как разбить число на цифры и вывести их через пробелы?

Входные данные: Дано число N, вывести через пробел все его цифры. Нельзя использовать массивы и готовых функцию.

Моё решение: Пытался реализовать таким образом, но к сожалению числа выводятся задом наперёд.

#include <iostream>
using namespace std;
int main() {
    int num;
    cin >> num;
    int first_copy = num, sec_copy = num;
    int digit_first;
    
    while (first_copy != 0){
        digit_first = first_copy % 10;
        first_copy = first_copy / 10;
        cout << digit_first << " ";
    }
    cout << " " << endl;

}

Пример: На вход дано 20718, необходимо вывести 2 0 7 1 8.


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

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

Вариант 1. Рекурсия.

void outdigs(int num)
{
    if (num == 0) return;
    int digit = num % 10;
    outdigs(num / 10);
    cout << " " << digit;
}

int main()
{
    int num;
    cin >> num;
    outdigs(num);
}

Вариант 2. Вектор (по сути стек). Точно так же можно с массивом...

int main()
{
    int num;
    cin >> num;
    vector<int> s;
    while(num)
    {
        s.push_back(num%10);
        num /= 10;
    }
    for(size_t i = s.size(); i-->0; )
        cout << s[i] << " ";
}

Вариант 3. Забавный (без арифметики, любой длины).

int main()
{
    string s;
    cin >> s;
    for(auto c: s) cout << c << " ";
}
→ Ссылка
Автор решения: TigerTV.ru

Вариант 1. C указателем, используя динамическую память:

#include <iostream>

using namespace std;

int main() {
    int num = 12345678;
    char *a = (char*)calloc(48, sizeof(char));
    char *p = a + 47;
    int n = num; 

    while (n != 0){
        int r = n % 10;
        n = n / 10;
        *(--p) = ' ';
        *(--p) = r + '0';
    }

    cout << p << endl;

    free(a);
}

Вариант 2. Без динамической памяти:

#include <iostream>

using namespace std;

typedef struct {
    uint64_t a;
    uint64_t b;
    uint64_t c;
    uint64_t d;
    uint64_t e;
    uint64_t f;
    uint64_t g;
    uint64_t h;
    uint64_t i;
    char z;
} __attribute__((packed)) A;

int main() {
    uint64_t num = 18446744073709551615ULL;

    A a;
    uint16_t *p = (uint16_t*)&a.z;

    a.a = 0x2030203020302030;
    a.b = 0x2030203020302030;
    a.c = 0x2030203020302030;
    a.d = 0x2030203020302030;
    a.e = 0x2030203020302030;
    a.f = 0x2030203020302030;
    a.g = 0x2030203020302030;
    a.h = 0x2030203020302030;
    a.i = 0x2030203020302030;
    a.z = '\0';

    for(uint64_t n = num; n != 0; n /= 10) *(--p) += n % 10;

    cout << (char*)p << endl;
}

Вариант 3. С двойным проворотом, без использования большего объема памяти(правда с ограничением на длину числа):

#include <iostream>

using namespace std;

int main() {
    int num = 12345678;
    int rev_num = 0; 
    int n = num;

    while (n != 0){
        rev_num *= 10;
        rev_num += n % 10;
        n /= 10;
    }
    while (rev_num != 0){
        cout << rev_num % 10 << ' ';
        rev_num /= 10;
    }
    cout << endl;
}

Вариант 4. Задействуем BCD (Двоично-десятичный код):

#include <iostream>

using namespace std;

int main() {
    uint64_t n = 12345678;
    uint64_t rev_num = 0;

    for (;n != 0; n /= 10){
        rev_num <<= 4;
        rev_num += n % 10;
    }
    for (;rev_num != 0; rev_num >>= 4){
        cout << (rev_num & 15) << ' ';
    }
    cout << endl;
}
→ Ссылка
Автор решения: AR Hovsepyan

Подобные задачи всегда легко и быстро решаются через строковые потоки(главная задача строковых потоков это форматирование, что и нам нужно). Решение вашей задачи:

void split(const int num)
{
    std::stringstream s;
    s << num;
    char c;
    while (s.get(c))
        std::cout << c << ' ';
}
→ Ссылка
Автор решения: Stanislav Volodarskiy

Отыщем последнюю степень десятки, которая не больше заданного числа - ten. Разделим заданное число на него - получится старшая цифра. Заданное число заменим на остаток. Разделим ten на десять, повторим пока ten не обнулится. Дополнительная память - одна целая переменная, никаких массивов, стеков, строк, рекурсий.

Код работает для неотрицательных чисел:

#include <iostream>

int main() {
    int num;
    std::cin >> num;

    int ten;
    for (ten = 1; ten <= num / 10; ten *= 10) {
    }
    
    for (; ten > 0; ten /= 10) {
        std::cout << num / ten << ' ';
        num %= ten;
    }
    std::cout << '\n';
}
$ g++ -std=c++17 -pedantic -Wall -Wextra -Werror temp.cpp 

$ echo 20718 | ./a.out
2 0 7 1 8
→ Ссылка