Как разбить число на цифры и вывести их через пробелы?
Входные данные: Дано число 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 шт):
Вариант 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 << " ";
}
Вариант 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;
}
Подобные задачи всегда легко и быстро решаются через строковые потоки(главная задача строковых потоков это форматирование, что и нам нужно). Решение вашей задачи:
void split(const int num)
{
std::stringstream s;
s << num;
char c;
while (s.get(c))
std::cout << c << ' ';
}
Отыщем последнюю степень десятки, которая не больше заданного числа - 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