数的计算
问题描述:
要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理: 1. 不作任何处理; 2. 在它的左边加上一个自然数,但该自然数不能超过原数的一半; 3. 加上数后,继续按此规则进行处理,直到不能再加自然数为止.
用全局数组保存递归中产生的结果解决超时问题。
#include<iostream> using namespace std; static int gold[1000]={0}; int count(int m) { int count2=0; if(m==1) return 1; if(m==0) return 1; int i; for( i=0;i<=m/2;i++) { if (gold[i]!=0) count2=count2+gold[i]; else count2=count2+count(i); } gold[m]=count2; return count2; } int main() { int N; int i; cin>>N; cout<<count(N); return 0; }
另一个通过的代码:
#include <iostream> using namespace std; int main(){ int n,a[2000]; fill(a,a+2000,1); cin>>n; for(int i=2;i<=n;i=i+2){ a[i]=a[i-1]+a[i/2];//每次增加一个分支 a[i+1]=a[i];//连着的两个相同 } cout<<a[n]<<endl; system("pause"); return 0; }
fill函数的作用是将一个区间的元素都替换成val值,
将一个区间的元素都赋予val值。函数参数:fill(first,last,val);//first为容器的首迭代器,last为容器的末迭代器,val为将要替换的值。
版权声明:本文为博主原创文章,未经博主允许不得转载。
posted on 2015-01-24 22:32 Tob__yuhong 阅读(168) 评论(0) 编辑 收藏 举报