数的计算
题目描述
我们要求找出具有下列性质数的个数(包含输入的正整数 n)。
先输入一个正整数 n(n≤1000),然后对此正整数按照如下方法进行处理:
1、不作任何处理;
2、在它的左边加上一个正整数,但该正整数不能超过原数的一半;
3、加上数后,继续按此规则进行处理,直到不能再加正整数为止。
输入格式
1 个正整数 n(n≤1000)
输出格式
1 个整数,表示具有该性质数的个数。
输入输出样例
输入 #1
6
输出 #1
6
说明/提示
满足条件的数为
6,16,26,126,36,136
解题思路
目标
输入一个数字,求这个数字按照题目中的方法处理,总共会有多少个满足条件的数字
分析
首先,我们从最简单的开始分析:
当n等于1的时候,只有一种情况 1
当n等于2的时候,有两种情况 2、12。也就是2本身的一种情况,加上前面加2的一半向下取整的所有情况
当n等于3的时候,有两种情况 3、13。 也就是3本身的一种情况,加上前面加3的一半向下取整的所有情况
当n等于4的时候,有4、14、24、124 四种情况。也就是4本身的一种情况,加上前面1到4的一半向下取整的所有情况。
当n等于5的时候,有5、15、25、125 四种情况。也就是5本身的一种情况,加上前面1到5的一半向下取整的所有情况。
当n等于6的时候,有6、16、26、126、36、136六种情况。也就是6本身的一种情况,加上前面1到6的一半向下取整的所有情况。
通过前面的分析,我们不难看出,这个题目可以使用递推的一个方法来做,f(n)应该是等于从n等于1的情况到等于n/2的情况一直累加起来的和,然后加上n本身的情况。
1、首先定义一个变量n用来保存要求的数字,定义一个int整型的数组f[1001]用来保存每一种情况的数量。
2、输入变量n,然后我们就可以从第一种情况开始依次按照递推关系式来求,先是把从1到等于一半的情况都累加起来,然后自增依次,加上这个数字本身的情况。
3、最后输出f[n]。
代码
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
int f[1001];
cin >> n;
for(int i=1; i<=n; i++){
for(int j=1; j<=i/2; j++){
f[i]+=f[j];
}
f[i]++;
}
cout << f[n];
return 0;
}