洛谷P1028 数的计算
题目描述
我们要求找出具有下列性质数的个数(包含输入的自然数nnn):
先输入一个自然数nnn(n≤1000n \le 1000n≤1000),然后对此自然数按照如下方法进行处理:
-
不作任何处理;
-
在它的左边加上一个自然数,但该自然数不能超过原数的一半;
-
加上数后,继续按此规则进行处理,直到不能再加自然数为止.
输入格式
111个自然数nnn(n≤1000n \le 1000n≤1000)
输出格式
111个整数,表示具有该性质数的个数。
输入输出样例
输入
6
输出
6
说明/提示
满足条件的数为
6,16,26,126,36,136
这题用简单递推就可以做出来了(找规律)
/* 递推法 举个例n=12 每一轮大循环打印一次数组的结果如下(循环了11次,为1时答案唯一直接存了): 0 1 2 0 0 0 0 0 0 0 0 0 0 0 1 2 2 0 0 0 0 0 0 0 0 0 0 1 2 2 4 0 0 0 0 0 0 0 0 0 1 2 2 4 4 0 0 0 0 0 0 0 0 1 2 2 4 4 6 0 0 0 0 0 0 0 1 2 2 4 4 6 6 0 0 0 0 0 0 1 2 2 4 4 6 6 10 0 0 0 0 0 1 2 2 4 4 6 6 10 10 0 0 0 0 1 2 2 4 4 6 6 10 10 14 0 0 0 1 2 2 4 4 6 6 10 10 14 14 0 0 1 2 2 4 4 6 6 10 10 14 14 20 12/2=6 12的左边可以为1 2 3 4 5中的数,所以f[12]=f[1]+f[2]+f[3]+f[4]+f[5]+f[6]+1(这个1是加上本身) 既f[12]=1+2+2+4+4+6+1=20 所以得到递推公式 f[n]=f[1]+f[2]+.....+f[n/2]+1; */ #include<stdio.h> #include<iostream> using namespace std; int f[1001]= {0,1}; void solve(int n) { for(int i=2; i<=n; i++) { for(int j=1; j<=i/2; j++) f[i]+=f[j]; f[i]++; } } int main() { int n; cin>>n; solve(n); cout<<f[n]<<endl; return 0; }