首页 > 代码库 > ACM——数的计算

ACM——数的计算

数的计算——(递归(超时)和非递归)

时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte
总提交: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