1010_数的计算

来源:互联网 发布:wow数据库7.0 编辑:程序博客网 时间:2024/05/01 16:25

比赛描述

要求找出具有下列性质数的个数(包含输入的自然数n):
先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理:
1. 不作任何处理;
2. 在它的左边加上一个自然数,但该自然数不能超过原数的一半;
3. 加上数后,继续按此规则进行处理,直到不能再加自然数为止.

输入

一个自然数n

输出

一个数,表示满足条件的数的个数

样例输入

6

样例输出

6

提示

样例说明:满足条件的数是6,16,26,126,36,136

题目来源

NOIP2001 普及组

本题容易想到的是递归算法,但是递归算法用于本题效率效率过低,可以用数组存储计算过的,以提高代码的效率。

代码如下:

#include <iostream>using namespace std;int fn(int n);int main(){int n;cin >> n;if (n<0 || n>1000)return 0;cout << fn(n) << endl;return 0;}int fn(int n){static int num[1000] = { 0 };//用于记录以及算过的,防止重复就算提高递归的效率int count = 1;//初始算一个,记录个数if (num[n] != 0)//算过则直接返回return num[n];if (n == 1 || n == 0)return 1;for (int i = 1; i <= n / 2; i++)count += fn(i);num[n] = count;//存储算过的值return num[n];}
递归法参考来源:http://blog.csdn.net/changshu1/article/details/47252207


还可以用递推的方法去解本题,从小到大依次算出。

可参考:http://blog.csdn.net/yixiang1989/article/details/36657741

0 0
原创粉丝点击