[NOIP2001 普及组] 数的计算
题目描述
我们要求找出具有下列性质数的个数(包含输入的正整数 n)。
先输入一个正整数 n(n 1000),然后对此正整数按照如下方法进行处理:
1. 不作任何处理;
2. 在它的左边拼接一个正整数,但该正整数不能超过原数,或者是上一个被拼接的数的一半
3. 加上数后,继续按此规则进行处理,直到不能再加正整数为止。
输入格式
一行,一个正整数 n(n 1000)。
输出格式
一个整数,表示具有该性质数的个数。
样例 1
样例输入 1
6
样例输出 1
6
根据处理方法二的描述,对于一个数字n,可以在n的左边拼接一个正整数,并且这个正整数满足条件:1.不超过原数 2.不超过上一次被拼接的数字的一半
可以通过模拟来找规律(关于递推公式):
假设输入的数字是n,
(1)n=1时,所有的结果:1
(2)n=2时,所有的结果:2,12
(3)n=3时,所有的结果:3,13
(4)n=4时,所有的结果:4,14,24,124
(5)n=5时,所有的结果:5,15,25,125
(6)n=6时,所有的结果:6,16,26,126,36,136
可以发现,dp[n]=1+dp[1]+dp[2]+dp[3]+···+dp[m](m
)
代码实现:
#include<iostream>
#include<cmath>
using namespace std;
int dp[501];
int main()
{
dp[1]=1;
dp[2]=2;
int n;
cin>>n;
if(n<=2)
cout<<dp[n]<<endl;
else
{
for(int i=3;i<=n;i++)
{
dp[i]=1;
int temp=floor(i/2);
int j=1;
while(j<=temp)
{
dp[i]+=dp[j];
j++;
}
}
cout<<dp[n]<<endl;
}
return 0;
}