数的计算
问题描述:
要求找出具有下列性质数的个数(包含输入的自然数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 阅读(98) 评论(0) 收藏 举报
浙公网安备 33010602011771号