下面的图形是著名的杨辉三角形:
如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列: 1, 1, 1, 1, 2, 1, 1, 3, 3, 1, 1, 4, 6, 4, 1, \cdots1,1,1,1,2,1,1,3,3,1,1,4,6,4,1,⋯
给定一个正整数 NN,请你输出数列中第一次出现 NN 是在第几个数?
输入描述
输入一个整数 NN。
def judege(a,b,n):
result=1
i=a
j=1
while j<=b:
result = int(result * i / j)
if result>n:
return result
i-=1
j+=1
return result
def searchFirstAppearByColumn(Column,num):
# 因为可以发现杨辉三角的最大值都在中间,而传入的都是每行第一个最小数字到底列号,
# 所以这里得到行需要*2,
row = 2 * Column
# 取得最大,保证开始搜索时左边界要小于等于右边界
r = max(num, row)
res = -1
# 二分查找 优化一下,不然检测通不过
while row <= r:
mid = (row + r) >> 1
if judege(mid,Column,num)>=num:
res=mid
r=mid-1
else:
row= mid + 1
# 判断是否是要求的数字
if judege(res,Column,num)==num:
print((res + 1) * res // 2 + Column + 1)
return 0
def start():
num = int(input())
# 从16开始因为c(16,32)已经是10的9次方左右
for i in range(16,-1,-1):
if searchFirstAppearByColumn(i,num)==0:
break
if __name__=='__main__':
start()
参考的:https://blog.csdn.net/qq_30347475/article/details/123598659
这位大佬写的,真的写的很详细