c语言斐波纳契数列判断素数,求斐波那契数列和素数

所谓斐波那契数列指的是数列:1,1,2,3,5,8,13,21,……。用语言描述就是后一项等于前两项和。

打印100以类的斐波那契数列

a = 1

b = 1

print(a)

print(b)

while True:

c = a + b

if c > 100:

break

a = b

b = c

print(c)

要点:

起始两项特殊处理

计算c后,a的值指向b,b的值指向c,交换后再循环

求斐波那契数列的101项

假设是从第0项开始,到第100项结束,共101项,那第0项和第1项都为1

a = 1

b = 1

c = 0 # 给变量c一个初始值,最后要打印第101项

for i in range(101):

if i > 1: # 0和1时不用计算

c = a + b

a = b

b = c

print(c)

# 573147844013817084101

使用递归实现斐波那契数列

在python中应该尽量避免使用递归,递归有层数限制,各个python版本限制各异。

def fib(n):

if n < 2:

return 1

else:

return fib(n-1) + fib(n-2)

for i in range(10):

print(fib(i))

# 输出

1

1

2

3

5

8

13

21

34

55

上边的代码随着n增大,嵌套层数就越来越大,对计算机的内存消耗会快速增大,代价相当 大。实际项目中不会这么用。

改进方案

def fib(n, pre=0, cur=1):

pre, cur = cur, pre + cur

print(cur, end=' ')

if n == 2:

return

fib(n-1, pre, cur)

fib(10)

# 输出

1 2 3 5 8 13 21 34 55

此种方案把每次计算的结果以实参的形式传递给函数,这样效率很高。

求100内的所有素数

如果一个整数只能被1和自身整除,那这个数就为素数。大于2的偶数一定不为素数

n = 101

count = 0

for i in range(1, n, 2): # 跳过偶数,但要记得2是素数

for j in range(2, i): # 在[2,i)范围内若能整除就说明该数不是素数

if i % j == 0:

break

else:

count += 1

if i == 1:

print(i)

print(2)

else:

print(i)

print('count: {}'.format(count + 1)) # count要加1是因为2这个素数

通过观察、分析,在判断一个数是否为素数时,可以只判断2到该数范围内的前一半数就可以。所以对上边的代码可以做优化

n = 101

count = 0

for i in range(1, n, 2): # 跳过偶数,但要记得2是素数

for j in range(2, int(i ** 0.5) + 1): # 这里做了优化,只对前一半数据进行判断

if i % j == 0:

break

else:

count += 1

if i == 1:

print(i)

print(2)

else:

print(i)

print('count: {}'.format(count + 1)) # count要加1是因为2这个素数

素数有一个这样的规律,一个较大的素数一定不能与一个较小的素数整除,根据这个规律可以用其他的方法求100内的素数

n = 101

lst = [2]

for i in range(3, n, 2):

for j in lst:

if i % j == 0:

break

else:

lst.append(i)

print([1] + lst)

# [1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

你可能感兴趣的:(c语言斐波纳契数列判断素数)