接受一个整型值,按照顺序打印他的每一位(函数,递归方法)
接受一个整型值,按照顺序打印他的每一位
列如;输入1234(一千二百三十四)
输出1 2 3 4
在这里,对于1234(一千二百三十四),我们可以分别求个位,十位,百位,千位,然后分别输出就行,这个是对于刚入门C语言学习不久的小白而言的代码做法,但是如何用函数与递归的方法来进行写这个代码,却是有待思考!
众所周知:对于新手小白而言,可以这样来求每一个个十百千位数:
千位q= n / 1000, 百位b= n / 100 % 10, 十位s= n / 10 % 10, 个位g=n % 10
然后可以用:printf("%d %d %d %d\n",g,s,b,q);依次来输出;
对于某些熟练的人
也可以用:printf("%d %d %d %d ", n / 1000, n / 100 % 10, n / 10 % 10, n % 10);的方法来输出
我们尤其需要注意取余,及除法的应用........
因此笔者的代码为:
//接受一个(无符号)整型值,按照顺序打印他的每一位
//1234(一千两百三十四)
//常规做法
#include <stdio.h>
int main()
{
int n = 0;
printf("请输入一个四位数字 :\n");
scanf_s("%d", &n);
printf("%d %d %d %d", n % 10, n / 10 % 10, n / 100 % 10, n / 1000); //4 3 2 1
printf("\n");
printf("%d %d %d %d", n / 1000, n / 100 % 10, n / 10 % 10, n % 10); //1 2 3 4
return 0;
}
在这里,笔者打印了俩个printf("");
至于结果:
这一种代码,看似简单,但却将数字简单的限定在了四位数,其他的位数数字都不能正确打印(不足四位数,有补0现象)
对于多于四位数字,则出现了......具体内容不方便多说,请看运转后的结果:
在这里,不管输入多少数字,都只能求四次取余或者除法,没有多余的运算。
但是对于一个成百上千的未知数,我们是否也是这样求呢??
我想:答案是否定的,因为对于一个很大的数字,我们一方面不知道具体有多少数字,另一方面,还不知道得设出多少未知数,写出多少个取余或者除法!
在这里,笔者认为:函数+递归,是一个很好的去处........
下面来欣赏一下,笔者用刚刚所学的函数+递归所写出的代码,若有不足之处,请各位多多坦待。
具体代码为:
//接受一个(无符号)整型值,按照顺序打印他的每一位
//函数写法
#include <stdio.h>
void dayin(int n)
{
if (n > 9)
{
dayin(n/10);
}
printf("%d ",n%10);
}
int main()
{
int n = 0;
printf("请输入任意数字:\n");
scanf_s("%d", &n);
dayin(n);
return 0;
}
1.在函数的定义部分用了void 函数,不用返回值;
2.函数的命名,简单自己能看懂即可
3.在这个函数的定义里面,有俩个最重要的代码,if (n > 9) 表示递归进入的条件;dayin(n/10) 表示递归跳出的条件;
笔者之拙见,代码已经奉上,解析,我想应该都能看懂;至于其他话,笔者便不再多言;
下面给出:
递归的俩个必要条件
1.存在限制条件,当满足这个限制条件的时候,递归便不再继续
2。每次递归的调用之后都越来越接近这个限制条件
但是,俩个仅仅是必要条件,而不是充分条件,
至于反列,请看笔者下面代码:
#include <stdio.h>
void test(int n)
{
if (n < 2000)
{
test(n + 100);
}
}
int main()
{
test(100);
return 0;
}
在这里面,对于递归的俩个条件都完美诠释,
并且if语句中递归的进入条件,test语句中递归的跳出条件都符合递归的俩个必要条件
但是,代码最后的运转结果却是大大出乎意料:
代码没有任何毛病,经得起考验,与推敲;
但是为什么会是这样的运转结果:笔者所知道的只有:栈溢出!
至于其他具体原因,请原谅笔者技艺不熟!
一道亮光打开了笔者心扉
- 点赞
- 收藏
- 关注作者
评论(0)