试题 历届真题 杨辉三角形【第十二届】【省赛】【B组】

 思路

杨辉三角的前两行都为1,并且每一行首尾都为1,所以当输入的N=1时,直接输出位置1

然后当我们输入的N大于1

我们开始建立杨辉三角的第三行,判断N如果在第三行中,则输出位置,结束循环。这个位置的计算方法就是获取当前行数,计算 前几行的长度 还有 当前行N出现的索引位置 的和。(杨辉三角第几行就有几个值,所以我们计算第五行第三个的位置,就是(1+2+3+4) + 3,这是一个等差数列)

如果第三行没有找到,我们就要根据第三行的值计算第四行的值,然后在判断N是否存在于第四行中。我们把第三行的值赋予给a,通过循环依次取a的值计算第四行,完事后把第四行赋值给b,把a清空。当我们继续计算第五行的时候,就可以把第五行赋值给a,把b清空给第六行用。

以下代码的b列表是杨辉三角第二行的两个 亿

我们通过两个a,b列表存储杨辉三角的 当前行 和 前一行,这样依次就可以计算N所在的行

n = int(input())
a = []
b = [1,1]
while True:
    if n == 1:
        print(1)
        break
    else:
        for i in range(len(b)+1):
            if i == 0 or i==len(b):
                a.insert(i,1)
            else:
                a.insert(i,b[i-1]+b[i])
        b = []
        if n in a:
            m=len(a)-1
            m = m + m*(m-1)/2
            print(int(m+a.index(n)+1))
            break

        for i in range(len(a)+1):
            if i == 0 or i == len(a):
                b.insert(i,1)
            else:
                b.insert(i,a[i-1]+a[i])
        a = []
        if n in b:
            m=len(b)-1
            m = m + m*(m-1)/2
            print(int(m+b.index(n)+1))
            break

这个代码依旧有缺陷,在比赛网站测试它会超时,并不能计算太大的值 ,当N==2345时,运行时间是0.9394

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值