洛谷 P1028 数的计算

[NOIP2001 普及组] 数的计算

题目描述

我们要求找出具有下列性质数的个数(包含输入的正整数 n)。

先输入一个正整数 n(n \leqslant 1000),然后对此正整数按照如下方法进行处理:

1. 不作任何处理;

2. 在它的左边拼接一个正整数,但该正整数不能超过原数,或者是上一个被拼接的数的一半

3. 加上数后,继续按此规则进行处理,直到不能再加正整数为止。

输入格式

一行,一个正整数 n(n \leq 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 \leq  \frac{}{}\frac{n}{2} )

代码实现:

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值