数的计算

题目描述
我们要求找出具有下列性质数的个数(包含输入的自然数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
采用下标即可算出值
不得不说编程题考的是数学发现这个规律需要强大的数学基础

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值