原题是这样的:
输入一个五位以内(含五位)的正整数
(1)判断它是一个几位数;
(2)请按序输出其各位数字;
(3)逆序输出其各位数字。
要求:使用指针
如输入:56439,
输出:
五位数
5,6,4,3,9
9,3,4,6,5
我已经实现输入数据,判断位数,并将每一位存到一个数组中。因为事先不知道用户要输入几位,所以数组按照有可能输入的最大数来定义,即输入五位数,,定义一个长度为5的数组a[5],把每一位装进数组中。但是假如用户输入了小于5位数的,并且这个数的中间有某一位是0,比如1004,那么这个时候数组各元素为{0,1,0,0,4},我的问题是:如何能按照题意,输出1,0,0,4 和4,0,0,1 ?
下面是我的代码段:
c
#include <stdio.h> int main(int argc, const char * argv[]) { unsigned long n = 0; //输入一个数 while (1) { printf("Input a number(0~9999): \n"); scanf("%lu", &n); if (n > 0 && n < 100000) { break; } } //判断是几位数 //每一位存入数组 int i = 0; int a[5] = {0}; int *p = &a[4]; while (n != 0) { *p = n % 10; n /= 10; i++; p--; } printf("\ndigit:%d\n\n",i); //遍历数组,输出元素 for (int i = 0; i < 5; i++) { printf("%d ", a[i]); } printf("\n"); //倒序输出元素 for (int i = 4; i >= 0; i--) { printf("%d ", a[i]); } printf("\n"); return 0; }
其实你的代码可以实现这样的功能吧。
你看,假设输入的是四位数,你也能正确判断是几位数并输出了吧。也就是你把数字拆开那个循环里的变量i。
你需要修改的是,在输出的时候,不要用i作循环变量,换个j什么的,然后把i当做正序输出的终点,或者逆序输出的起点。
可以参考桶排序的思路,不过桶排序是对应的数出现一次就在对应的桶中加一,这里可以这样设计:没出现过的数字的桶中是0,出现过一次及一次以上的对应的桶中只是1,然后按顺序遍历桶,如果是1就输出,是0就不输出(顺序还是逆序在输出的时候控制就OK了)
你都可以判断出用户输出多少位了 循环的时候就用位数来做循环依据就好了啊``!
题主已经将1004
解析成了{0, 1, 0, 0, 4}
数组,然后遇到的问题是第一个占位的0(其实代表没有该位)
与后面的有效0(该位上的数据为0)
无法区分。题主只需将占位符换成一个其他的唯一含义字符便可消除0
的二义性了。比如
// 用PLACEHOLDER填充数组,输出时过滤掉PLACEHOLDER位
#define PLACEHOLDER 0xff