数的计算

问题描述:

要求找出具有下列性质数的个数(包含输入的自然数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为将要替换的值。


版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/Tobyuyu/p/4965785.html