题目描述
我们要求找出具有下列性质数的个数(包含输入的自然数nn):
先输入一个自然数nn(n \le 1000n≤1000),然后对此自然数按照如下方法进行处理:
不作任何处理;
在它的左边加上一个自然数,但该自然数不能超过原数的一半;
加上数后,继续按此规则进行处理,直到不能再加自然数为止.
输入输出格式
输入格式:
11个自然数nn(n \le 1000n≤1000)
输出格式:
11个整数,表示具有该性质数的个数。
输入输出样例
输入样例#1:
6
输出样例#1:
6
这道题极其坑对于大于10的数如何处理成为了一个麻烦
通过观察得知;
f[1]=1
f[2]=2=f[1]+1
f[3]=2=f[1]+1
f[4]=4=f[1]+f[2]+1
f[5]=4=f[1]+f[2]+1
F[i] = F[1] + … + F[i/2] + 1
亦或者
n%2==0时
f(n)=f(n-1)+f(n/2)
n%2 ==1时
f(n)=f(n-1)
先上代码:
def xyz(n):
a=str(n)
xyz=[]
if a[0]=='1':#若已经为0 说明可以停止了
return None
else:
for i in range(1,(int(a[0])//2)+1):每次都到一半并将这些数放入列表当中
b=str(i)+a
xyz.append(int(b))
return (xyz)
def abc(x):
z=[]
z.append(x)
suma=1
sumb=0
while suma!=sumb:#只要列表长度还在变化就说明还未选择完毕
sumb=suma
for i in z:
q=xyz(i)
if q==None:
pass
else:#通过set去重
z.extend(q)
z=list(set(z))
suma=len(z)
return (suma)
#xyz函数配合abc函数可以罗列出1-9对应的值
z=[1]
for i in range(1,10):
z.append(abc(i))
x=int(input())
if x>=10:
for i in range(10,x+1):
a=0
for j in range(i//2+1):
a+=z[j]
z.append(a)
print(z[x])
else:
print(z[x])
这里我直接用第一种
首先我先罗列出1-9的数的值
因为只有个位数才能用我自己的方法罗列
接着采用方法一直罗列到x
采用下标即可算出值
不得不说编程题考的是数学发现这个规律需要强大的数学基础