C语言中的经典例题-正序输出与逆序输出任意数字

 

 从大一学习计算机相关课程到现在也有将近两年时间了,经常苦于一些心得体会没有时间进行
记录与后续探讨,今后我将会在csdn博客中记录分享一些自己学习上的想法,希望大家也能不
吝赐教,多与我进行探讨。
谭浩强的C程序设计-第四版中有这样一道例题:

 给定一个不多于五位的正整数,求:
1.求它的位数;
2.分别输出每一位数字;
3.按逆序输出各位数字;

这道题目乍一看给人一种轻松简单的感觉,甚至很多编程初学者都能在看到题目的一瞬间
制定出初步编程思路,但事实似乎并不是这样。

简单分析一下题目,大多数人的思路无外乎就是写五个判断模块,分别对应它的个,十,
百,千,万五种情况,再分别在模块中将位数输出,正序逆序输出。这种做法对于题目这种
给定最大位数的情况自然能轻松应对,但若题目改为“给定任意一个正整数,求:..."呢
这种情况下就体现出计算机编程的严谨性与复杂性了。
对于第一问来说,我们可以利用整型数据的“去尾”属性来进行位数的输出,即对于int类型
的任意数字n,我们只需将它写在一个每次除以10的循环中,例如1234/10的值为123,而123/10
的值为12,12/10的值为1,1/10的值为0,当n/10的值为0时退出循环即可。具体的程序代码如下:
int Number (int n)
{
 int i=1;
 for(i=1; ;i++)
 {
  n/=10;
  if(n==0)
  {
   break;
  }
  return i;
 }
}

这样以来,求任意数字n的位数就迎刃而解。

接下来看第二问正序输出与第三问逆序输出,由于正序输出属于逆序输出的继承问题

我们先来看逆序输出,再进行正序输出,具体原因将会在下面的篇幅中解释。

上一问中我们已经对“/10”进行了探讨,它的意义为丢弃个位,与其相对应的

还有“%10”,意义与“/10”相反:是取个位。例如:

1234%10=4 继而丢弃4而取123

123%10=3 丢弃3而取12

12%10=2...只需不断重复先取余输出后丢弃的过程即可

于是我们只需进行关于%10的循环即可完成逆序输出,具体程序代码如下:

void Printreverse(int n)

{

do

{

printf("%d",n%10);

n/=10;

}

while (n!=0);

}

特别的,在这里没有使用惯用的for语句而使用了do while 语句,也可以使用

While语句来进行上述功能,需要注意的是,同样的语句,do while与while 中,

的判断条件都为n!=0,但输出结果却不相同,例如对于上面的程序输入0,输出为0,而将格式改为while后输入0,输出值却变成了1,这个细微的不同是两种语句不同的判断执行顺序导致的。

接下来看这道题中看似最简单的第二问:顺序输出。

有了前面两问的铺垫,我们就可以写出顺序输出的算法:

1234/1000=1,输出1,1234%1000=234

234/100=2,输出2,234%100=34

34/10=3,输出3,34%10=4

4/1=4,输出4,4%1=0,退出循环

为了得到循环开始时n/的1000,我们只需利用第一问求得n的位数p,再对

Pow(10,p-1)的函数进行运算,即可达成目的。(不用<math,h>中的pow函数,

使用for循环也可以完成10^(p-1)的计算)

void Printorder(int n)

{

   int p=pow(10,Number(n)-1);

   do

{  printf(%d,n/p);

   p/=10;

   n=n%p;

}

   while(p!=0);

}

至此,三个问题都已经得到了解决,这道经典的C语言程序题不仅令我记住了相关算法“/10”和“%10”的运用,也增强了我的代码书写能力,希望今后能发现更多的有益知识与大家共同探讨,共同进步。












  • 16
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值