Определите цифры в заданном числе.

Я новичок в программировании, и я застрял в проблеме. Я хочу, чтобы моя программа идентифицировала отдельные цифры в заданном числе, например, если я ввожу 4692, она должна идентифицировать цифры и печатать 4 6 9 2. И да, без использования массивов.


person Community    schedule 11.06.2009    source источник
comment
хороший вопрос для интервью. Благодарность!   -  person George Godik    schedule 30.09.2009


Ответы (7)


Идеальная проблема рекурсии для решения, если вы новичок в программировании...

4692/1000 = 4

4692%1000 = 692

692/100 = 6

692%100 = 92

92/10 = 9

92%10 = 2

Вы должны получить представление о цикле, который вы должны использовать сейчас, чтобы он работал для любого числа. :)

person Suvesh Pratapa    schedule 11.06.2009
comment
4692%1000 = 692, а не 2. 4692/1000 = 4, а не 469. - person chocojosh; 11.06.2009
comment
Да, +1 ваш ответ хорош, потому что он ведет к ответу, а не просто решает домашнее задание, но, пожалуйста, исправьте свои числа! - person Jason Cohen; 11.06.2009
comment
Проблема со слишком быстрым набором текста в том, что иногда я печатаю быстрее, чем думаю. ;) Исправлено! - person Suvesh Pratapa; 11.06.2009

Не писал код C год, но это должно работать.

int i = 12345;

while( i > 0 ){
   int nextVal = i % 10;
   printf( "%d", nextVal );
   i = i / 10;
}
person Babak Naffas    schedule 12.06.2009
comment
Это совершенно неправильно. Вы печатаете значение i 5 раз: 123451234123121. Даже если вы печатаете nextVal вместо i, вы делаете это в неправильном порядке и напечатаете 54321. - person Jacob Krall; 29.09.2009
comment
Вы должны сохранить результат в строку и перевернуть его перед печатью. Вы также можете использовать стек для обратного - person phuclv; 02.08.2013
comment
Ответ @Babak Naffas - довольно простое, но типичное решение. Но если вам нужна более высокая скорость, вы можете попробовать двойное нажатие, чтобы разделить число на BCD. После этого легко вынуть каждое число и распечатать. - person phuclv; 02.08.2013

Просто и приятно

void PrintDigits(const long n)
{
    int m = -1;
    int i = 1;

    while(true)
    {
        m = (n%(10*i))/i;
        i*= 10;
        cout << m << endl;

        if (0 == n/i)
            break;
    }
}
person Anil8753    schedule 21.05.2014
comment
Работает только для неотрицательных чисел. - person Anil8753; 21.05.2014

Другой подход состоит в том, чтобы иметь две петли.

1) Первая петля: перевернуть число.

int j = 0;
while( i ) {
   j *= 10;
   j += i % 10;
   i /= 10;
}

2) Второй цикл: печатайте числа справа налево.

while( j ) {
   std::cout << j % 10 << ' ';
   j /= 10;
}

Это предполагает, что вы хотите, чтобы цифры печатались справа налево. Я заметил, что здесь есть несколько решений, в которых нет этого предположения. Если нет, то достаточно будет второго цикла.

person flu    schedule 18.10.2018
comment
Обратите внимание, что часть 1 прерывается, если i заканчивается нулями, потому что тогда j останется равным нулю в начале, и умножение его на 10 не окажет на него никакого влияния. - person Felix Jassler; 21.03.2021

Я думаю, что идея состоит в том, чтобы напечатать неповторяющиеся цифры (иначе это было бы слишком просто)... ну, вы можете отслеживать уже напечатанные целые числа, не имея массива, кодирующего их в другое целое число.

какой-то псевдо C, чтобы дать вам подсказку:

int encoding = 0;
int d;

while (keep_looking()) {
  d = get_digit();
  if (encoding/(2**d)%2 == 0) {
    print(d);
    encoding += 2**d;
  }
}
person fortran    schedule 29.09.2009
comment
Что такое d**2? Я думаю, вы имеете в виду d*d. - person pmg; 30.09.2009
comment
Если я правильно помню, ** - это оператор возведения в степень Фортрана. C не имеет оператора возведения в степень. Вы можете заменить 2**d на 1 << d. - person pmg; 30.09.2009
comment
вот почему я сказал псевдо-c, и я не хотел подвергать новичка операциям побитового сдвига и маскирования (%2 тоже самое, что и &1), поэтому я ограничился арифметическими операциями. - person fortran; 30.09.2009

Вот простое решение, если вы хотите просто напечатать цифры из числа.

#include <stdio.h>
/**
printdigits
*/
void printDigits(int num) {

   char buff[128] = "";
   sprintf(buff, "%d ", num);
   int i = 0;
   while (buff[i] != '\0') {
      printf("%c ", buff[i]);
      i++;
   }
   printf("\n");
}
/*
main function
*/
int main(int argc, char** argv) {
   int digits = 4321;
   printDigits(digits);
   return 0;
}
person rjoshi    schedule 29.09.2009
comment
Вам не нужно 128 символов, чтобы напечатать целое число. Кроме того, зачем инициализировать buff, если вы просто собираетесь перезаписать его sprintf() позже? Кроме того, зачем вам char *p, если вы никогда его не используете? - person Chris Lutz; 29.09.2009
comment
да, раньше я планировал выполнить итерацию с помощью указателя, поэтому у меня есть char *p. Что касается размера, он не упомянул длину чисел, поэтому для безопасного размера использовал 128. - person rjoshi; 29.09.2009
comment
int может содержать только числа до 4 миллиардов на большинстве платформ, поэтому вы должны быть в безопасности с 10 цифрами (11 символов с нулевым терминатором). Если вас беспокоит 64-битность, это всего лишь от 20 до 25 символов. - person Chris Lutz; 29.09.2009
comment
Он сказал, не используя массивы - person flu; 18.10.2018

Это правильно

int main()        
{
    int number;
    cin>>number;
    int nod=0;
    int same=number;

    while(same){
        same/=10;
        nod++;
    }

    while(nod--){               
        cout<<(int)number/(int)pow10(nod)%10<<"\t";       
    }
    return 0;
}
person Danny    schedule 02.06.2014
comment
не совсем понял логику - person Shrikanth N; 18.10.2018