在int中列出数字,不会丢失0

时间:2012-02-04 10:09:58

标签: c

我正在编写一个列出整数输入数字的程序。

示例:

Please enter an integer number: 5021
The digits are:
5
0
2
1

该程序工作正常,除非是以0结尾的数字,因为我先使用while循环(而num> 0)颠倒了数字,以便按上面显示的顺序打印数字。我希望有人可以指出我正确的方向,因为我现在似乎无法想到另一种方式:)

抱歉无法弄清楚如何在每行前面添加4个空格来添加代码(是否有另一种(更简单的)添加代码的方式?)。

int main() {
  int userInt; /* integer input by user */
  int revInt;  /* reversed integer */


  printf("Please enter an integer number: ");
  scanf("%d", &userInt);

  /* reverse int */
  revInt = reverseInteger(userInt);

  /* print digits */
  printDigits(revInt);

  return 0;

}

int reverseInteger(int num) {
  long sum = 0;
  int remainder;

  while(num) {
    remainder = num%10;         /* get last digit of number */
    sum = sum*10 + remainder;   /* move digits by one place in sum and add remainder of number */
    num = num/10;               /* remove last digit of number */
  }

  return sum;
}

void printDigits(int num) {
  int remainder;

  printf("The digits are:\n");

  while(num) {
    remainder = num%10;         /* get last digit of number */
    printf("%d \n", remainder); /* print last digit */
    num = num/10;               /* remove last digit of number */
  }
}

6 个答案:

答案 0 :(得分:3)

int中的最大位数很小,因此在这种情况下您可以安全地使用递归:

#include <stdio.h>
#include <stdlib.h>

void
print_digits(unsigned n) {
  div_t q = div(n, 10);
  if (q.quot > 0) print_digits(q.quot);
  printf("%d\n", q.rem);
}

int main() {
  print_digits(50210);
  return 0;
}

Output

5
0
2
1
0

答案 1 :(得分:3)

在ReverseInteger的代码中,变量 remainder 始终保留您输入的数字的最后一位数字(即使末尾有零)。所以你的功能已经准备就绪,我们可以稍微调整一下:

void reverseIntegerAndPrint(int num) {
  int remainder;

  while(num) {
    remainder = num%10;         /* get last digit of number */
    printf("%d \n", remainder);   /* prints last digit!! */
    num = num/10;               /* remove last digit of number */
  }
  return;
}

答案 2 :(得分:0)

您需要在[{1}}中存储循环传递的次数,并在循环reverseInteger函数时重复使用此信息。

除了在printDigits中反转整数之外,您还可以将所有数字以相反的顺序存储在数组中,并在另一个整数变量中存储数字位数。然后,您可以从结尾开始逐个元素地打印数组元素(数字)。

答案 3 :(得分:0)

在还原号码之前,请执行以下操作:

while(number%10 == 0)
{
  number /= 10;
}

...//invering code here

答案 4 :(得分:0)

问题在于reverseInteger(1) == reverseInteger(10) == reverseInteger(100) == reverseInteger(1000) == ...,因此,一旦您使用此功能(返回int),您就已经丢失了所需的信息。一种解决方案是首先计算尾随零,导致类似这样的事情(假设为userInt > 0):

int numTrailingZeros = 0;
while(!(userInt % 10)) {
    ++numTrailingZeros;
    userInt /= 10;
}
revInt = reverseInteger(userInt);
printDigits(revInt);
while(numTrailingZeros) {
    printf("0 \n");
    --numTrailingZeros;
}

答案 5 :(得分:0)

也可以将其转换为字符串并打印保留:

#include "stdio.h"
#include "string.h"
int main(void)
{
    int i,j;
    char s[20];
    scanf("%i", &i);
    sprintf(s, "%i", i);
    for(j=strlen(s); j>0; j--) {
        printf("%c \n", s[j-1]);
    }
}