Держите начальные нули, когда целая длина неизвестна - PullRequest
0 голосов
/ 10 мая 2018

Следующая программа отменяет ввод данных пользователем.Однако для чисел с конечными нулями нули «игнорируются» при печати обратного числа.

#include<stdio.h>

int main(void)
{
   int n, reversedNumber = 0, remainder;

    printf("Enter an integer: ");
    scanf("%d", &n);

    while(n != 0)
    {
        remainder = n%10;
        reversedNumber = reversedNumber*10 + remainder;
        n /= 10;
    }

    printf("Reversed Number = %d\n", reversedNumber);

    return 0; 
}

Поскольку целая длина пользовательского ввода неизвестна , как мы можем напечататьвсе завершающие нули, например:

Enter an Integer: 3000 
Reversed Number = 0003

Ответы [ 4 ]

0 голосов
/ 12 мая 2018

Поскольку конечная цель состоит в том, чтобы «добавлять цифры исходного номера, начиная со второй до последней цифры исходного номера», зачем вообще использовать символы (строки) - просто используйте цифры.

Если я правильно понимаю ваш вопрос:

/* test.c sum the digits of a number -- except for the last digit */

#include <stdio.h>

int main (void)
{
    int number;
    printf ("\nenter a number: ");
    scanf ("%i", &number);

    // power = multiple of 10 matching left-most digit in number
    // power is also a loop counter of sorts
    int power = 1;
    while ( number / power > 9 ) 
        power *= 10;    

    // process each digit moving from left to right across number
    // addition is commutative (order of digits does not affect result)

    int sum = 0;
    do {
        int digit = number / power;

        if ( power != 1 )           // skip last digit in number
            sum += digit;    

        number %= power;            // drop left-most digit from number
        power /= 10;                // adjust multiple of 10
    }
    while ( power > 0 );

    printf ("sum (skipping last digit) = %i\n", sum);

    return 0;
}
0 голосов
/ 10 мая 2018

Для этого следует использовать массив символов (строку), потому что в соответствии с общим правилом математики мы не учитывали нули слева .

#include <stdio.h>
#include <string.h>
int main(){
    char value[]="3000";
    printf(" Number : %s ",value);
    char *rev=strrev(value);
    printf("Reversed Number = %s ",rev);
    return 0;
}
0 голосов
/ 10 мая 2018

Поскольку целая длина пользовательского ввода неизвестна, как мы можем напечатать все конечные нули?

Целая длина текста может быть известна . Используйте "%n" для записи смещения сканирования до этой точки.


Чтобы численно перевернуть строку (очевидно, возможно простое текстовое обращение), запишите длину ввода.

При печати убедитесь, что начальные нули предварительно добавлены, если необходимо, используя "%0*u".

int main(void) {
  int start, end;
  unsigned n;        // I prefer unsigned here, but could use int and %d below.
  printf("Enter an integer: ");
  fflush(stdout);
  //         v--- Consume leading white-space
  if (scanf(" %n%u%n", &start, &n, &end) == 1) {
    int length = end - start;
    unsigned reversedNumber = 0;
    for (int i = length; i > 0; i--) {
      unsigned remainder = n % 10;
      reversedNumber = reversedNumber * 10 + remainder;
      n /= 10;
    }
    printf("Reversed Number = %0*u\n", length, reversedNumber);
  }
  return 0;
}

Пример прогона

Enter an integer: 00123000
Reversed Number = 00032100
0 голосов
/ 10 мая 2018

длина целого числа неизвестна

Это не так. : -)

Подсчитайте количество итераций и передайте его последнему вызову printf как ширину.

#include<stdio.h>

int main(void)
{
   int n, reversedNumber = 0, remainder;

   printf("Enter an integer: ");
   scanf("%d", &n);

   {
     size_t i = (0 > n);

     while (n != 0)
     {
       remainder = n % 10;
       reversedNumber = reversedNumber * 10 + remainder;
       n /= 10;
       ++i;
     }

     printf("Reversed Number = %0*d\n", (int) i, reversedNumber); /* Alternatively
                                            to the cast you can define i as int. */
   }

   return 0; 
}

С документация :

4 Каждая спецификация преобразования представлена ​​символом%. После% появляется следующее:

[...]

  • Необязательная минимальная ширина поля. Если преобразованное значение имеет меньше символов, чем ширина поля, оно дополняется пробелами (по умолчанию) слева (или справа, если был задан левый флажок регулировки, описанный ниже) ширине поля. Ширина поля принимает форму звездочки * (описывается позже) или неотрицательного десятичного целого числа. [...])

[...]

5 Как отмечалось выше, ширина поля [...] может указываться звездочкой. В этом случае аргумент int предоставляет ширину поля или точность. Аргументы, определяющие ширину поля [...], должны появляться (в таком порядке) перед аргументом (если есть), который нужно преобразовать.

[...]

...