给出一个较高位数的数字,如何顺序和逆序输出其各位数字?

先来看一道比较经典的题目:

给出一个不多于5位的正整数,要求:

(1)求出它是几位数?

(2)分别输出每一位数字;

(3)按逆序输出每一位数字;

<1>题目要求我们首先判断一下这个数字是几位数,一般我们在考虑这个问题的时候可能会想到使用 if-else语句,(我刚开始就是这么做的),让他们分别与99/999/9999……比较,看他们是否在各个区间上面,进而判断这是一个几位数。这样做出来的程序虽然易于理解和阅读。但是如果我们把数字的数量级放在更高的位数上的话,就会发现这样的if-else语句我们要写非常多,代码非常冗余,而且非常容易出现差错。但是只要我们用一个简单的循环语句的话,就会非常容易的解决这个问题。

if-else语句:

if (num>9999)

      place=5;

 else  if (num>999)

      place=4;

 else  if (num>99)

      place=3;

 else  if (num>9)

      place=2;

 else place=1;

这样的代码看起来非常冗余,再来看一下改进后的代码:

int n=0; 
do 
{
        n++;
        num/= 10 ;
         } 
while( num>0 );

(其中num定义的是输入的数字)

在定义之前对输入的数字数据类型进行了定义 int 型,它在除以10以后,会出现小数点部分,又因为是整型,会将小数部分舍弃掉,其实就是舍弃掉数字的个位。此时n已经加一,依此进行循环,知道num=0的时候跳出do-while循环,此时n就是这个数字的位数。

<2>要输出每一位数字也可以仿照第一题的思想,要输出第一位数字,就要舍弃其他位数上的数字,输出第一位的数字,完成以后就要输入第二位数字了,这时候就有点麻烦了,首先得把第一位上的数字减去,留下的部份同样的进行留下第一位数字舍弃其余部分的操作就好了。说起来容易,做起来并不容易。首先来看一下代码的实现。

void PrintOrder1(int n)
{
int count;
//首先需要知道其位数,然后可以知道第一个被除的数字是多少
count = GetFigures(n);//定义的变量用来接收上一个计算位数函数的返回值
int power = 1;   //写一个for循环得到第一次的除的数。
for(int i=0;i<count-1;i++)//4->1000
{
power *= 10;//power = power*10;
}

do
{
printf("%d ",n/power);//得到最高位
n %= power;//丢弃最高位
power /= 10;//进行下一次的循环对次位要除的数改变其数值
}while(n!=0);
printf("\n");

}

<3>n逆序输出相对于顺序输出来书简单一些,因为它只需要丢弃前面的数字来,输出后面的数字就好了,而这一点对数字10进行求余运算,很容易得到其没以为数字,然后在进行第二次运算的时候,仿照第一题的算法丢弃掉其个位数字就好了,这样依次进行运算,每一位的逆序就能够进行输出了。

void PrintReverse(int n)
{
do
{
printf("%d ",n%10);//
得到个位数字
n /= 10;//丢弃个位数字
}while(n!=0);
printf("\n");
}

猜你喜欢

转载自blog.csdn.net/jojojo1234/article/details/79727175