求正整数的位数及正序逆序输出

求正整数的位数及正序逆序输出

正整数,在计算机中是作为一个整体来进行存储的。而本次将正整数正序输出和逆序输出都需要我们将其每一位上的数字单独提取出来,按照相应的次序进行输出。为了提取正整数每一位的数字,我们可以借助for循环根据10进制数字的数学关系用相应的计算得出。而为了方便确定for循环的起点和终点,我们会优先求出该整数的位数,在此基础上再进行前面的操作。

求整数的位数

在这里,我们单独建立一个函数Getnum来达到目的。
不但方便了以后的调用,而且不论我们在子函数中对该正整数进行什么样的操作,都不会影响主函数中数字本身的值。(相信大家都会明白吧,参数问题啦参数问题啦,实在不行就记住吧,记住还不行吗~)
话不多说,代码如下:

int Getnum(int n)
{
	int i=0;
	while(n!=0)
	{
		n/=10;
		i++;
	}
	return i;
}

为什么会实现呢?
首先,我们要明确整除(/)这一运算。整除是不存在小数的,整数部分会被保留,小数部分就被抛弃了,比如123/10就只会剩下12。

此外,我们设置了帮助我们计数的i,n(我们需要处理的正整数,相信大家都能看出来,以后就用n代替了)在while循环中每次都整除10,相当于从个位开始每次循环都丢弃一位数字,每丢一次i就加1,每丢一次i就加1。

最后,i就是n各位数中能被我们丢掉的非0数字的个数了。

正序输出和逆序输出

好了,正菜来了!

1.正序输出

相信大家都已经等不及了吧,先上代码:

void ForwardPrint(int n)//正序输出
{
	for(int i=Getnum(n);i>=1;i--)
	{
		printf("%d",n/(int)pow(10.0,i-1));
		n%=(int)pow(10.0,i-1);
	}
}

实不相瞒,眼睛明亮的人已经发现问题了,那么你发现了没?

首先,这个函数的返回值类型就不一样。你要问我什么是返回值,那我就晕给你看,直白点说,就是函数名称前面的关键字,像这个函数就是关键字void,而前面那个函数则是关键字int。至于返回值的作用吗,就是要你来明确你编写这个函数要达到的目的了。

借助算法的概念来看,其实函数的作用也无外乎得到一个确定的值或者进行一个或者一系列有意义的操作。

相比较而言,得到一个值比较好理解,就拿数学来说吧,f(x)和y在数学里是不是相等的?而每有一个x,最后的f(x)和y都有一个确定的值。比如Getnum函数中,return i的意思就相当于数学表达式i=Getnum(n)。n是123,i就等于3;n是12,i就等于2。因此,相信这一句

for(int i=Getnum(n);i>=0;i–)

的意思大家就能理解了吧。Getnum(n)就相当于f(x),当n由主函数传入ForwardPrint函数中时,它就变成一个和相当于y的i相等的值了。

下一个问题来了,如果返回值类型是void又是什么意思呢?进行有意义的操作又是什么意思呢?

这就好比,要求你画一个f(x)=2x的图像,而你画成了f(x)=4x。怎么办呢,要改正的啊。你可以用前面的方法求出每一个x对应的2x的值,然后再画出正确的图像。又或者你只需要每次找到x轴和4x的图像的中点,然后将这些中点连线就好了,至于2x是什么值你根本就不需要知道嘛。

至于有没有办法忽视返回值类型,每次都大肆操作一番就好。对于这个还是比较简单的,return 0就好了啊。就像主函数一样,所以有没有恍然大悟的感觉呢?

下面再来说明其他问题。比如pow函数。这是一个库里经由他人之手写好的函数,还是有两个参数的,也就是双变量函数,作用是返回第一个“变量”的第二个“变量”次方,你只需要拿来调用。当然天下没有免费的午餐,你需要“标明是他写的”。所以在最最最开始的时候需要写上一句

#include<math.h>

有没有发现和哪一句代码比较像?所以位置写在哪就不用再细说了吧。

至于需要说明的小细节则是,注意第一个参数10.0和函数名前方多加的(int)。不论是这个函数的第一个参数还是返回值,都是默认为浮点数,所以,不仅在格式上我们需要按照小数的格式来写(什么?如果是整数怎么办?加个.0不就好了嘛),还需要我们在需要整数时,将浮点数强制转化成整数,就比如在函数名前多加一个(int),就表明将该函数的返回值强制转化成整数。当然,如果本来的结果含有小数部分,在强制转化的过程中会把小数部分抛弃,所以如果结果不是整数的时候就不要随便强转了,会有误差的。

那么为什么我们在ForwardPrint函数中要强制转化成整数呢?
第一,当然是前面说的最终结果是个整数喽。
第二,取余也可以叫做模运算(%)和整除(/)运算的运算对象都必须是整数(所以小数部分才会被丢的嘛,人家根本不认识)
那么取余运算的结果如何呢?举几个例子:12%2=0,11%2=1,23%5=3.大概就懂了吧。

2.逆序输出

有了上面的叙述,这个就相对简单了,如果你能把上面的全看懂的话,那么逆序输出也就没什么问题了。正序输出和逆序输出的思路本质上一样的,只不过做的数学运算有一小点点不一样。

void BackwardPrint(int n)//逆序输出
{
	while(n!=0)
	{
		printf("%d",n%10);
		n/=10;
	}
}

至于while循环和for循环有什么区别,在本质上是没区别的,只不过书写格式不一样罢了。

最后,把所有代码合在一起,包括主函数就是这样了:

#include<stdio.h>
#include<math.h>
int Getnum(int n)
{
	int i=0;
	while(n!=0)
	{
		n/=10;
		i++;
	}
	return i;
}
void ForwardPrint(int n)//正序输出
{
	for(int i=Getnum(n);i>=1;i--)
	{
		printf("%d",n/(int)pow(10.0,i-1));
		n%=(int)pow(10.0,i-1);
	}
}
void BackwardPrint(int n)//逆序输出
{
	while(n!=0)
	{
		printf("%d",n%10);
		n/=10;
	}
}
int main()
{
	int n;
	scanf("%d",&n);
	printf("%d\n",Getnum(n));
	ForwardPrint(n);
	printf("\n");
	BackwardPrint(n);
	return 0;
}

结果是这个样子的:

在这里插入图片描述
怎么样,各位看官,看懂了吗?

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值