数的计算——(递归(超时)和非递归)
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
总提交:1050 测试通过:312
总提交:1050 测试通过:312
描述
要求找出具有下列性质数的个数(包含输入的自然数n):
先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理:
1. 不作任何处理;
2. 在它的左边加上一个自然数,但该自然数不能超过原数的一半;
3. 加上数后,继续按此规则进行处理,直到不能再加自然数为止.
输入
一个自然数n
输出
一个数,表示满足条件的数的个数
样例输入
6
样例输出
6
提示
样例说明:满足条件的数是6,16,26,126,36,136
题目来源
NOIP2001 普及组
1 #include<iostream> 2 using namespace std; 3 static int sum=1; 4 static int arr[1000]={0}; 5 void fun(int& k)//递归方法 6 { 7 if(k==0) 8 return ; 9 for(int i=1;i<=k;i++) 10 { 11 sum++; 12 int k2=i/2; 13 fun(k2); 14 } 15 } 16 17 int f(int& k){//非递归方法才用全局数组保存计算结果 18 int count=0; 19 if(k==0) 20 return 0; 21 int i; 22 for(i=1;i<=k;i++){ 23 if(arr[i]!=0){ 24 count+=arr[i]; 25 } 26 else{ 27 int k2=i/2; 28 arr[i]=f(k2)+1; 29 } 30 } 31 if(count!=0) 32 return count; 33 return arr[k]; 34 } 35 int main() 36 { 37 int n1; 38 cin>>n1; 39 int k=n1/2; 40 fun(k); 41 cout<<sum<<endl; 42 cout<<f(n1)<<endl; 43 return 0; 44 }
http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1010