基础递归题目。
题目:
我们要求找出具有下列性质数的个数(包含输入的自然数n):
先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理:
1.不作任何处理;
2.在它的左边加上一个自然数,但该自然数不能超过原数的一半;
3.加上数后,继续按此规则进行处理,直到不能再加自然数为止.
理解:
- 题目不太好理解
- 大概意思是说一个 小于输入的数一半的数可以计入总数。
- 可以一直加到这个数字的一半为0
- 把每次除以二的过程理解为一层,用递归来做
- 多层递归, 时间复杂度大概爆炸了。。
代码:
#include<iostream>
#include<string>
using namespace std;
int sum=1,i=0; //包括这个数字本身,所以sum初始化为1
int fun(int i);
int main()
{
cin>>i;
i=i/2; //第一层
sum +=i;
fun(i); //开始递归
cout<<sum<<endl;
}
int fun(int i)
{
for(int j=1;j<=i;j++) //遍历该层所有的数
{
if(j/2 != 0) { //判断下一层是否存在
sum+=j/2;
fun (j/2);
}
}
}