【编程练习】求正整数的位数,并逆序打印
题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
【方法一】使用穷举法。穷举法的意思就是列出所有可能出现的结果。因为题目给了限定条件为不多于5位的正整数,所以很容易就可以找出5位数、4位数、3位数、2位数、1位数的情况。
示例程序:
#include <stdio.h>
int main(void)
{
int a,b,c,d,e,x;
printf("请输入一个整数(0-99999):");
scanf("%d",&x);
a = x/10000; /*分解出万位*/
b = x%10000/1000; /*分解出千位*/
c = x%1000/100; /*分解出百位*/
d = x%100/10; /*分解出十位*/
e = x%10; /*分解出个位*/
if (a != 0)
printf("这是个5位数, 逆序:%d %d %d %d %d\n",e,d,c,b,a);
else if (b != 0)
printf("这是个4位数, 逆序:%d %d %d %d\n",e,d,c,b);
else if (c != 0)
printf("这是个3位数, 逆序:%d %d %d\n",e,d,c);
else if (d != 0)
printf("这是个2位数, 逆序:%d %d\n",e,d);
else if (e != 0)
printf("这是个1位数, 逆序:%d\n",e);
return 0;
}
程序输出结果如:
【方法二】假如这题的限定条件改为“不多于10位的正整数”,或者直接改为“给一个正整数”。这可怎么办,总不能再使用穷举法吧。这时应该想着怎么设计一个通用的算法。以满足各种通用的条件。
关于此题的通用算法示例程序如下:
#include <stdio.h>
int main(void)
{
char buf[20];
int n = 0, i = 0, j = 0;
long x;
printf("请输入一个整数(整数的位数不大于10):");
scanf("%d",&x);
while(x != 0)
{
buf[i] = x%10; // 提取从后往前的的数字依次保存到数组中。如x=1234,则依次提取4 3 2 1
x = x/10; // 依次舍掉最后一位往前的位数
i++; //数组索引
}
n = i; //循环结束后,i的值正好为该正整数的位数
printf("这是个%d位数\n",n);
printf("逆序数字为:");
for (j = 0; j < n; j++)
{
printf("%d ", buf[j]);
}
}
程序运行结果如:
这是一道常见的编程练习题。这类题目能用穷举法首先使用穷举法,然后再想着怎么设计通用的算法,以适用尽可能多的情况。
每天进步一点点,关注小编,每天和小编一起打卡学习吧!