Как я могу сохранить цифру целого числа, которое я пытаюсь отделить? - PullRequest
0 голосов
/ 15 июня 2019

У меня проблема в том, что я хочу взять целое число и отделить его. Например: пользователь вводит: 23432. Консоль должна вывести «2 3 4 3 2. У меня проблема с сохранением этих цифр. Например,

  User Input : 2020
  assign input to num.
  digit = 2020 % 10 = 0 <--- 1st Digit
  num = num / 10 = 202
  digit2 = num % 10 = 2 <--- 2nd Digit
  num = num / 100 = 20.2 
  temp = round(num) = 20
  digit3 = num % 10 = 0 <--- 3rd Digit
  digit4 = num / 10 = 2 <---- 4th Digit

Проблема с этим подходом состоит в том, что он зависит от пользовательского ввода, я работаю с диапазоном 1-32767, поэтому я не знаю, сколько цифровых переменных создать. Используя созданную мной структуру, может ли кто-нибудь помочь в ее запуске, независимо от того, какое это число, цифра сохраняется и печатается так, как я описал?

int Rem(int num);
  int Div(int num);

  int main() {
      int num;
      printf("Enter an integer between 1 and 32767: ");
      scanf("%d", &num);
      Rem(num);
      Div(num);
      printf("%d","The digits in the number are: ");

  }


      int Rem(int num) {
          int rem = num % 10;
          return rem;
      }

      int Div(int num){
          int div = num / 10;
          return div;
      }

Ответы [ 3 ]

0 голосов
/ 15 июня 2019

Это действительно сложный подход.Почему бы не прочитать строку и проанализировать строку следующим образом:

int main(void) {
  char buf[256]; // should be big enough, right? 10^256-1
  memset(buf, 0, 256];
  puts("enter something : ");
  if( NULL == fgets(STDIN, 255, buf)) {
    perror("Egad! Something went wrong!");
    exit(1);
  }
  // at this point, you already have all the input in the buf variable
  for(int i=0; buf[i]; i++) {
    putchar( buf[i] ); // put out the number
    putchar( ' ' ); // put out a space
  } 
  putchar( '\n' ); // make a nice newline
}

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

0 голосов
/ 15 июня 2019

Одним из способов, с помощью которого C позволяет справляться с проблемами, которые чрезвычайно элегантны, является рекурсия.

Рассмотрим процедуру, которая знает, как печатать только последнюю цифру числа, с предшествующим пробелом, если необходимо.

void printWithSpaces(int neblod)
{
    // Take everything except the last digit.
    int mene = neblod / 10;
    // Now extract the last digit
    int fhtagn = neblod % 10;

    // Check if there are leading digits
    if (mene != 0)
    {
        // There are, so do some magic to deal with the leading digits
        // And print the intervening space.
        putchar(' ');
    }
    putchar(fhtagn + '0');
}

OK. Так что это хорошо, за исключением того, что мы можем использовать, чтобы "сделать немного магии, чтобы справиться с начальными цифрами"?

Разве мы не хотим просто напечатать их в виде последовательности цифр с подходящими пробелами?

Разве это не то, что void printWithSpaces(int neblod) делает?

Итак, мы делаем одно изменение:

void printWithSpaces(int neblod)
{
    // Take everything except the last digit.
    int mene = neblod / 10;
    // Now extract the last digit
    int fhtagn = neblod % 10;

    // Check if there are leading digits
    if (mene != 0)
    {
        // There are, so print them out
        printWithSpaces(mene);
        // And print the intervening space.
        putchar(' ');
    }
    putchar(fhtagn + '0');
}

И все готово.

Для любопытных, следующая статья о C-рекурсии может предоставить как забавное чтение, так и немного понимания моего немного необычного выбора имен переменных. ;) http://www.bobhobbs.com/files/kr_lovecraft.html

0 голосов
/ 15 июня 2019

Проблема этого подхода заключается в том, что он зависит от пользовательского ввода, я работаю с диапазоном 1-32767, поэтому я не знаю, сколько цифровых переменных создать.

Так что посчитай. Вы можете сделать это, увеличивая переменную в 10 раз каждый раз, пока увеличение ее еще раз не сделает ее больше, чем введенное вами число:

int num;
printf("Enter an integer between 1 and 32767: ");
scanf("%d", &num);
int div = 1;
while(div * 10 <= num)
    div *= 10;

Затем вы можете многократно делить свое число на этот делитель, чтобы получить каждую из цифр, делив делитель на 10 каждый раз, чтобы сдвинуть одно место за раз:

printf("The digits in the number are: ");
while(div > 0)
{
    printf("%d ", (num / div) % 10);
    div /= 10;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...