程序分析:
1. 首先先判断输入的数 x 是否为不多于5位数的正整数;
2. 求 x 有几位,最好的办法办法就是让 x %10 每模一次记录一次,最后记录的结果就是 x 的位数;
3. 在正序输出之前 x 就变成另外一个值了,所以在正序输出程序开始时,需要留下 x 的一个备份 y ,在算完位数之后把原来备份 y 赋值给 x ,这样子才可输出它的每一位上的数字;
4. 此时引入权重index,它的初始值是1000,接着用 x%index 就可得到正序输出的每一位的数字;
5. (同3一样) 在逆序输出之前 x 也变成另外一个值了,所以在逆序输出程序开始时,也需把原来备份 y 赋值给 x ;
6. 若想得到逆序的值,也很好办,我们用 x%10 就依次得到了个位、十位、百位、千位、万位的值,刚好满足了题目的要求。
下面是我写的两种方法,仅供参考:
法一:(因为当时正在学switch语句就用的它,我写的比较麻烦)
#include<stdio.h>
int main()
{
int x;
int i, u, v, w, s, t;
printf("请输入值:");
scanf_s("%d", &x);
if (x < 0 || x / 100000 != 0) //也可写x>99999
{
printf("enter data error\n");
return NULL;
}
u = x % 100000 / 10000;
v = x % 10000 / 1000;
w = x % 1000 / 100;
s = x % 100 / 10;
t = x % 10;
for (i = 1; x > 1; i++)
{
x = x / 10;
}
printf("共有%d位数\n", i);
printf("顺序输出后的结果为:");
switch (i)
{
case 1:printf("个位:%d", t); break;
case 2:printf("十位:%d,个位:%d\n", s, t); break;
case 3:printf("百位:%d,十位:%d,个位:%d\n", w, s, t); break;
case 4:printf("千位:%d,百位:%d,十位:%d,个位:%d\n", v, w, s, t); break;
case 5:printf("万位:%d,千位:%d,百位:%d,十位:%d,个位:%d\n", u, v, w, s, t); break;
}
printf("逆序输出后的结果为:");
switch (i)
{
case 1:printf("个位:%d", t); break;
case 2:printf("十位:%d,个位:%d\n", t, s); break;
case 3:printf("百位:%d,十位:%d,个位:%d\n", t, s, w); break;
case 4:printf("千位:%d,百位:%d,十位:%d,个位:%d\n", t, s, w, v); break;
case 5:printf("万位:%d,千位:%d,百位:%d,十位:%d,个位:%d\n", t, s, w, v, u); break;
}
return 0;
}
调试结果如下:
法二:(简单直观)
#include <stdio.h>
int main()
{
int n;
printf("请输入数:");
scanf_s("%d", &n);
int m = n;//m是备份
if (n <= 0 || n > 99999)
{
printf("enter data error\n");
return 0;
}
//1. 获取位数
int count = 0;
while (n != 0)
{
n /= 10;
count = count + 1;
}
printf("位数是 %d\n", count);
int index = 1; //权重
for (int i = 0; i < 4; i++)
{
index = index * 10;
}
//2.正着打印
n = m; //0 -> 12345
while (n != 0)
{
printf("%d", n / index);
n = n % index;
index = index / 10;
}
printf("\n");
//3.逆着打印
n = m;//0->12345
while (n != 0)
{
printf("%d", n % 10);
n /= 10;
}
printf("\n");
return 0;
}
调试结果如下: