原题如下:
我们要求找出具有下列性质数的个数(包含输入的自然数nnn):
先输入一个自然数n(n≤1000),然后对此自然数按照如下方法进行处理:
不作任何处理;
在它的左边加上一个自然数,但该自然数不能超过原数的一半;
加上数后,继续按此规则进行处理,直到不能再加自然数为止.
输入格式:
1个自然数n(n≤1000)
输出格式:
1个整数,表示具有该性质数的个数。
输入样例#1: 输出样例#1:
6 6
说明
满足条件的数为
6,16,26,126,36,136
下面是我的代码:
#include<stdio.h>
main()
{
int func(int x);
int n,y;
scanf("%d",&n);
y=func(n);
printf("%d",y);
}
int func(int x)
{
int cnt=1;
for(int i=1;i<=x/2;i++)
{
cnt++;
func(i);
}
return cnt;
}
问题说明:每一个数n可以在其左边与之组合的数(<=n/2)需要自身先与该数(n)组合,再将能与n/2组合的所有数与n组合。
所以很明显这是一个递归问题。
递归问题的关键是如何构造一个递归函数,下面是这道题的构造思路:
①n=1时,n/2=0,只有1自身,该函数应计算出1。
②n=2时,n/2=1,所以1及能与1组合的数首先都能单独与2组合,然后能与1组合的数与1形成的组合体本身也可与2组合。
③
(1)首先计入n自身
(2)所有能与n组合的数首先自身应满足<=n/2,所以可用for循环,使之出现由1~<=n/2的数;
(3) 在循环体中,首先应做的是对这些数进行统计,因为i满足<=n/2,i自身是可以直接与n组合的,即每个i与n形成的组合是需要计入的。
(4)每个i自身又是需要把i当做n再做相同的步骤。所以这里需要调用函数自身。
④在函数体内部调用函数本身时,可将函数理解为一个黑匣子,它的作用就是计算出复合条件的所有数的数目。
构造好函数,带入main函数直接使用即可。