【问题标题】:Keep leading zeros when integer length is unknown当整数长度未知时保持前导零
【发布时间】:2018-10-20 22:17:44
【问题描述】:

以下程序反转用户输入。但是,对于带有尾随零的数字,在打印反转数字时会“忽略”零。

#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

【问题讨论】:

  • 将其作为字符串读取,并反转字符串。
  • 我之前做过,也许我需要为这个问题添加一些上下文。目标是从原始数字的倒数第二个数字开始添加原始数字的数字。这意味着将 string 转换回整数将丢失前导零。 @AndrewHenle
  • @daumie 所以,您问了如何做某事,但这不是您的实际问题?您需要准确地说明您想知道的内容。 alk 提供的答案准确地回答了所提出的问题。

标签: c integer reverse


【解决方案1】:

整数长度未知

不是。 :-)

计算迭代次数并将其作为宽度传递给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; 
}

来自the documentation

4 每个转换规范都由字符 % 引入。在 % 之后,依次出现以下内容:

[...]

  • 可选的最小字段宽度。如果转换后的值的字符数少于字段宽度,则在字段宽度的左侧(或右侧,如果已给出稍后描述的左侧调整标志)用空格(默认情况下)填充。字段宽度采用星号 *(稍后描述)或非负十进制整数的形式。[...])

[...]

5 如上所述,字段宽度 [...] 可以用星号表示。在这种情况下,一个 int 参数提供字段宽度或精度。指定字段宽度 [...] 的参数应(按此顺序)出现在要转换的参数(如果有)之前。

[...]

【讨论】:

  • 获取:警告:字段宽度应具有类型“int”,但参数类型为“size_t”(又名“无符号长”)[-Wformat] 而且,我注意到添加了一个额外的零例如 3000 反转为 00003。
  • 是的,你是对的。我更正并注释了代码。
  • 查看我对负数的修复。
  • 太棒了!我忽略了负数。现在按预期工作。谢谢。
【解决方案2】:

您应该为此使用 char 数组(字符串),因为它的一般数学规则 我们没有考虑左边的零

#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;
}

【讨论】:

  • strrev() 不是 C,而是一些供应商特定的扩展。
【解决方案3】:

由于用户输入的整数长度未知,我们如何打印所有尾随零?

整数文本长度可以知道。使用"%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

【讨论】:

    【解决方案4】:

    由于最终目标是“从原始数字的倒数第二个数字开始添加原始数字的数字”,为什么要使用字符(字符串)——只使用数字。

    如果我正确理解您的问题:

    /* 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-26
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      • 1970-01-01
      • 2015-03-04
      • 1970-01-01
      相关资源
      最近更新 更多