Разбить число на цифры

Помогите разбить 3 значное число на цифры
ответ должен выглядеть так
cout<<a<<« »<<b<<« »<<c<<endl;

Мне кажется стоит использовать операцию остатка от деления(%). Дальше додумывай сам, алгоритм может позже распишу, если не сможешь

//================================================
// Name        : 3int.cpp
// Author      : IrishSilvan
// Version     :
// Copyright   : 
//================================================

#include <iostream>
using namespace std;

int main() {
    int n = 0;
    int a,b,c;
    cout << "Введите трехзначное целое число: ";
    cin >> n;
    a = n/100;
    b = (n % 100)/10;
    c = n % 10;
    cout << a << "_" << b << "_" << c;
    return 0;
}

А обобщить на любое целое неотрицательное число и оформить в виде функции слабО? ;)

Ну можно немножко посидеть и такое запилить, но задача была четкая, 3хзначное число, разложить на 3 отдельных, задача выполнена, выдумывать что-то не собираюсь. Завтра может попробую.

Вот, на любое целое или дробное, отрицательное или неотрицательное число
// Разбиение числа на цифры

#include <iostream>
#include <string>

using std::cout;
using std::cin;
using std::endl;
using std::ends;
using std::string;

bool check4(string x) // проверка на пропущенный ноль в начале дробного числа
{
    if ((static_cast<int>(x[0]) == 44) // если знак "," первый, ИЛИ
        || (static_cast<int>(x[0]) == 46) // если знак "." первый, ИЛИ
        || ((static_cast<int>(x[0]) == 43 || static_cast<int>(x[0]) == 45) // если "+" ИЛИ "-" первый знак, И
            && (static_cast<int>(x[1]) == 44) || (static_cast<int>(x[1]) == 46))) // "." ИЛИ "," второй знак
    {
        return true; // если обнаружена точка-запятая без предшествующей цифры, то истина, что ноль пропущен.
    }
    else
        return false;
}

bool check3(string x) // проверка количества точек-запятых в дробном числе
{
    unsigned int count = 0;

    for (int i = 0; x[i]; i++)
    {
        if (static_cast<int>(x[i]) == 44 // знак ","
            || static_cast<int>(x[i]) == 46) // знак "."
        {
            count++;
        }
    }
    if (count > 1) // если в числе больше одной точки-запятой, то ошибка
        return false;
    else
        return true;
}

bool check2(string x) // Проверка корректности остальных знаков
{
    for (int i = 1; x[i]; i++)

        if (!(static_cast<int>(x[i]) == 44 // знак ","
            || static_cast<int>(x[i]) == 46 // знак "."
            || (static_cast<int>(x[i]) >= 48 // цифры
                && static_cast<int>(x[i]) <= 57)))
        {
            return false; // если обнаружен знак - не цифра и не точка-запятая, то ошибка
        }
    return true;
}

bool check1(string x) // Проверка корректности первого знака
{                                       
    if ((static_cast<int>(x[0]) >= 43 // знаки "+" "-" "." ","
        && static_cast<int>(x[0]) <= 46)
        || (static_cast<int>(x[0]) >= 48 // цифры
            && static_cast<int>(x[0]) <= 57))
    {
        return true;
    }
    else
        return false; // если обнаружен знак - не цифра, не плюс-минус и не точка-запятая, то ошибка
}

void frag(string x)
{
    cout << "Ваше число состоит из цифр: ";

    if(check4(x)) // проверка на пропущенный ноль перед дробью
        cout << "0" << ends; // если пропущен, печатаем ноль

    for (int i = 0; x[i]; i++)
    {
        if (static_cast<int>(x[i]) >= 48 // печатаем только цифры
            && static_cast<int>(x[i]) <= 57)
        {
            cout << x[i] << ends;
        }
    }
}

int main()
{
    setlocale(LC_CTYPE, ".1251");

    string x;

    while (true)
    {
        cout << "Введите любое число и нажмите Enter: ";
        getline(cin, x);

        if (check1(x) && check2(x) && check3(x)) // проверка корректности введенных данных
            frag(x);
        else
            cout << "Ошибка! Введеные данные не корректны или не являются числом!";

        cout << endl << endl;
    }
}

Slonopotam, ты решал задачу, исходя из некорректно понятого условия. Изначально было написано: Помогите разбить 3 значное число на цифры. Число! Т.е. предполагается, что число существует уже в виде экземпляра числового типа (int, double и родственные типы), а не в виде строки символов.

По программе.

(1) Не стоит хардкодить коды цифр и знаков. Например:

           (static_cast<int>(x[0]) >= 48 // цифры
            && static_cast<int>(x[0]) <= 57))

в другой кодовой таблице этим кодам могут соответствовать совсем другие символы. Более переносимый вариант:

           (x[0] >= '0' && x[0] <= '9')   // цифры

(Полностью переносимый вариант — это сравнение с каждой из цифр в отдельности, поскольку теоретически возможны кодовые таблицы, в которых цифры не идут единым блоком. Но я с такой экзотикой не встречался. А вот с буквами национальных алфавитов такое встречается очень часто.)

(2) С десятичным разделителем всё ещё веселее. Правильным было бы запрашивать у операционной системы какой символ используется для десятичного разделителя в локали, действующей в момент запуска программы.

(3) В программе не учитывается возможность ввода чисел в «научной» форме. Например, .758e2 — это 75.8. Подробности см. в википедии.

Так что в плане универсальности твоего решения ты немного погорячился.

Но попытка засчитывается. +1 к карме ))

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.