题目描述
我们要求找出具有下列性质数的个数(包含输入的正整数n)。
先输入一个正整数n(n≤1000),然后对此正整数按照如下方法进行处理:
- 不作任何处理;
- 在它的左边拼接一个正整数,但该正整数不能超过原数,或者是上一个被拼接的数的一半;
- 加上数后,继续按此规则进行处理,直到不能再加正整数为止。
输入一个自然数n
输出满足上述条件的数的个数
找规律
这题可以从1到n一个一个数字推答案。
输入自然数n | 满足条件的数 | 输出个数 |
1 | 1 | 1 |
2 | 2 | 2 |
3 | 3,13 | 2 |
4 | 4,14,24,124 | 4 |
5 | 5,15,25,125 | 4 |
6 | 6,16,26,126,36,136 | 6 |
7 | 7,17,27,127,37,137 | 6 |
8 | 8,18,28,128,38,138,48,148,248,1248 | 10 |
9 | 9,19,29,129,39,139,49,149,249,1249 | 10 |
以输入n=8为例
满足条件的有8,18,28,128,38,138,48,148,248,1248
输出的满足条件的个数是10,刚好等于分别输入1,2,3,4时输出的答案之和再加1(该数本身)
找到这一规律之后可以总结得出
F(n)=F(1)+F(2)+F(3)...+F[n//2]+1
代码实现
由上述的分析我们可以发现这题能采取打表的方式输出
创建一个列表a,往里面存放上一定数量的0,然后分别给列表中下标为1和2的元素初始值1和2,再从下标为3的位置开始遍历直到n,每一轮遍历计算其之前一半的元素和,循坏结束后加1存入列表,python代码如下
n=int(input())
a=[0]*1001
a[1]=1
a[2]=2
for i in range(3,n+1):
for j in range(1,i//2+1):
a[i]+=a[j]
a[i]+=1
print(a[n])