Python计算斐波那契数列

华电北风吹

天津大学认知计算与应用重点实验室

日期:2015/5


利用Python计算第一个达到一百万位数的斐波那契数列各位数之和 结果为4501552

以下是我用到的代码,不是中间需要一些人工操作来加快收敛性,有兴趣读者可以写代码加快收敛

首先执行这个,可以大致确定一百万个数所在斐波那契序列的位置

i=1
j=1
k=i+j
count=3
while count<4850000:
    i=j
    j=k
    k=i+j
    count+=1
result=str(k)
print('k长度')
k_len=len(result)
print(k_len)

sum=0
for item in range(0,len(result)):
    sum+=int(result[item])
print('k各位数之和')
print(sum)

file_object = open('python.txt','w')
list=[str(i)+'\n',str(j)+'\n',str(k)+'\n',str(k_len)+'\n']
file_object.writelines(list)
file_object.close()
接下来就是根据上一步的结果,确定向前还是向后

向前的代码为

input = open('python.txt')

i=input.readline()
i=i.strip('\n')
i=int(i)

j=input.readline()
j=j.strip('\n')
j=int(j)

k=input.readline()
k=k.strip('\n')
k=int(k)

print('Read Data end')
input.close()
count=0
while count<4000:
    i=j
    j=k
    k=i+j
    count+=1
    
result=str(k)
print('k长度')
k_len=len(result)
print(k_len)

file_object = open('python.txt','w')
list=[str(i)+'\n',str(j)+'\n',str(k)+'\n',str(k_len)+'\n']
file_object.writelines(list)
file_object.close()

print('iterator up结束')
向后的代码为
input = open('python.txt')

i=input.readline()
i=i.strip('\n')
i=int(i)

j=input.readline()
j=j.strip('\n')
j=int(j)

k=input.readline()
k=k.strip('\n')
k=int(k)

print('Read Data end')
input.close()
count=0
while count<10:
    k=j
    j=i
    i=k-j
    count+=1
    
result=str(k)
print('k长度')
k_len=len(result)
print(k_len)

file_object = open('python.txt','w')
list=[str(i)+'\n',str(j)+'\n',str(k)+'\n',str(k_len)+'\n']
file_object.writelines(list)
file_object.close()

print('iterator down结束')
为了查看结果的方便还有一个查看txt内容的代码
input = open('python.txt')

i=input.readline()
i=i.strip('\n')
print('i的长度')
print(len(i))

j=input.readline()
j=j.strip('\n')
print('j的长度')
print(len(j))

k=input.readline()
k=k.strip('\n')
print('k的长度')
print(len(k))

k_len=input.readline()
k_len=k_len.strip('\n')
k_len=int(k_len)
print('数据k长度')
print(k_len)

result=j
sum=0
for item in range(0,len(result)):
    sum+=int(result[item])
print('各位数之和')
print(sum)
实验过程遇到的问题

本问题的关键是如果你每次k更新后都判断k的位数的话,程序会变得特别卡,然而如果仅仅是执行更新k的操作的话程序是执行效率很高的,因此需要减少k位数的计算。然后遇到的问题就是确定第一百万位斐波那契数列出现的位置,采用二分法的思想。根据每一步的反馈的k的位数,直至找到满足要求的k.

本实验还有一个问题就是,因为i,j,k都是位数比较大,所以到最后读写txt就变成影响效率的主要因素。由于对python还不是特别了解,不知道能不能像matlab那样,将这些数据不放txt,而放在内存中,可以被直接调用的话,程序的效率将会提高的更快。

你可能感兴趣的:(python)