Как получить цифры числа без преобразования его в массив строк/char?

Как получить то, что цифры числа находятся на С++, без преобразования его в строки или массивы символов?

Ответ 1

Далее печатаются цифры в порядке возрастания (т.е. единицы, затем десятки и т.д.):

do {
    int digit = n % 10;
    putchar('0' + digit);
    n /= 10;
} while (n > 0);

Ответ 2

Как насчет floor(log(number))+1?

С n цифрами и использованием базы b вы можете выразить любое число до pow(b,n)-1. Таким образом, чтобы получить число цифр числа x в базе b, вы можете использовать обратную функцию возведения в степень: логарифм base-b. Чтобы справиться с нецелочисленными результатами, вы можете использовать трюк floor()+1.

PS: Это работает для целых чисел, а не для чисел с десятичными знаками (в этом случае вы должны знать, какая точность используемого вами типа).

Ответ 3

Потому что все взводя, не зная вопроса.
Вот моя попытка бесполезности:

#include <iostream>

template<int D> int getDigit(int val)       {return getDigit<D-1>(val/10);}
template<>      int getDigit<1>(int val)    {return val % 10;}

int main()
{
    std::cout << getDigit<5>(1234567) << "\n";
}

Ответ 4

Я видел много ответов, но они all забыли использовать цикл do {...} while(), который на самом деле является каноническим способом решения этой проблемы и правильно обрабатывает 0.

Мое решение основано на этом на Naveen.

int n = 0;
std::cin>>n;

std::deque<int> digits;
n = abs(n);
do {
    digits.push_front( n % 10);
    n /= 10;
} while (n>0);

Ответ 5

Вы хотите что-то подобное?

 int n = 0;
    std::cin>>n;

    std::deque<int> digits;
    if(n == 0)
    {
        digits.push_front(0);
        return 0;
    }

    n = abs(n);
    while(n > 0)
    {
        digits.push_front( n % 10);
        n = n /10;
    }
    return 0;

Ответ 6

Что-то вроде этого:

int* GetDigits(int num, int * array, int len) {
  for (int i = 0; i < len && num != 0; i++) {
    array[i] = num % 10;
    num /= 10;
  }
}

Мод 10 даст вам цифры. Div 10s будет увеличивать число.

Ответ 7

Целочисленная версия тривиальна:

int fiGetDigit(const int n, const int k)
{//Get K-th Digit from a Number (zero-based index)
    switch(k)
    {
        case 0:return n%10;
        case 1:return n/10%10;
        case 2:return n/100%10;
        case 3:return n/1000%10;
        case 4:return n/10000%10;
        case 5:return n/100000%10;
        case 6:return n/1000000%10;
        case 7:return n/10000000%10;
        case 8:return n/100000000%10;
        case 9:return n/1000000000%10;
    }
    return 0;
}

Ответ 8

простая рекурсия:

#include <iostream>

// 0-based index pos
int getDigit (const long number, int pos) 
{
    return (pos == 0) ? number % 10 : getDigit (number/10, --pos);
}

int main (void) {
    std::cout << getDigit (1234567, 4) << "\n";    
}

Ответ 9

Эти решения являются рекурсивными или итеративными. Может ли более прямой подход быть немного более эффективным?

Слева-направо:

int getDigit(int from, int index)
{
   return (from / (int)pow(10, floor(log10(from)) - index)) % 10;
}

Справа налево:

int getDigit(int from, int index)
{
   return (from / pow(10, index)) % 10;
}

Ответ 10

Первая цифра (наименее значимая) = num% 10, вторая цифра = пол (num/10)% 10, 3-я цифра = пол (число/100)% 10. и т.д.

Ответ 11

Простым решением было бы использовать журнал 10 числа. Возвращает общее количество цифр - 1. Это можно исправить, используя преобразование числа в целое число.

int(log10(number)) + 1

Ответ 12

Используйте последовательность операций mod 10 и div 10 (независимо от синтаксиса на С++), чтобы назначить цифры по одному к другим переменным.

В псевдокоде

lsd = number mod 10
number = number div 10
next lsd = number mod 10
number = number div 10

и т.д...

болезненны!... но не строки или массивы символов.

Ответ 13

Не так круто, как ответ Мартина Йорк, но обращаясь только к произвольной проблеме:

Вы можете напечатать положительное целое число больше нуля, а просто с рекурсией:

#include <stdio.h>
void print(int x)
{
    if (x>0) {
        print(x/10);
        putchar(x%10 + '0');
    }
}

Это будет печатать последнюю младшую цифру.

Ответ 14

Несколько лет назад, в ответ на вышеуказанные вопросы, я бы написал следующий код:

int i2a_old(int n, char *s)
{
    char d,*e=s;//init begin pointer
    do{*e++='0'+n%10;}while(n/=10);//extract digits
    *e--=0;//set end of str_number
    int digits=e-s;//calc number of digits
    while(s<e)d=*s,*s++=*e,*e--=d;//reverse digits of the number
    return digits;//return number of digits
}

Я думаю, что функция printf (...) делает что-то подобное.

Теперь я напишу следующее:

int i2a_new(int n, char *s)
{
    int digits=n<100000?n<100?n<10?1:2:n<1000?3:n<10000?4:5:n<10000000?n<1000000?6:7:n<100000000?8:n<1000000000?9:10;
    char *e=&s[digits];//init end pointer
    *e=0;//set end of str_number
    do{*--e='0'+n%10;}while(n/=10);//extract digits
    return digits;//return number of digits
}

<сильные > Преимущества:таблица поиска отдельно; C, С++, Java, JavaScript, совместимый с PHP; получить число цифр, min comparisons: 3; получить число цифр, max comparisons: 4; быстрый код; сравнение очень простое и быстрое: cmp reg, immediate_data → 1 тактовая частота процессора.

Ответ 15

Получите все отдельные цифры во что-то вроде массива - два варианта:

int i2array_BigEndian(int n, char a[11])
{//storing the most significant digit first
    int digits=//obtain the number of digits with 3 or 4 comparisons
    n<100000?n<100?n<10?1:2:n<1000?3:n<10000?4:5:n<10000000?n<1000000?6:7:n<100000000?8:n<1000000000?9:10;
    a+=digits;//init end pointer
    do{*--a=n%10;}while(n/=10);//extract digits
    return digits;//return number of digits
}

int i2array_LittleEndian(int n, char a[11])
{//storing the least significant digit first
    char *p=&a[0];//init running pointer
    do{*p++=n%10;}while(n/=10);//extract digits
    return p-a;//return number of digits
}