1. 程式人生 > 其它 >c++求素數_python經典練習題之九九乘法表、列印菱形、列印對頂三角形、斐波拉契數列、素數...

c++求素數_python經典練習題之九九乘法表、列印菱形、列印對頂三角形、斐波拉契數列、素數...

技術標籤:c++求素數

學學習簡單的練習,學到後面會有越來越多的解法來寫!

作業的目的是為了讓大家熟悉程式語言,鍛鍊將思路轉換成程式邏輯。

九九乘法表

help(print)

先思考能不能打印出方陣

# 1 方陣

# 1 方陣
for i in range(1, 10):
line = ''
for j in range(1, 10):
line += str(i) + '*' + str(j) + '=' + str(i*j) + ' '
print(line)
print('-' * 30)

89dccae72a068b6e2b5230e1c5db8dcd.png

# 2 九九乘法表

for i in range(1, 10):
for j in range(1, 10):
if i >= j:
print(str(j) + '*' + str(i) + '=' + str(i*j), end=' ')
print()
print('-' * 30)

# 條件合併

for i in range(1, 10):
for j in range(1, i+1):
print(str(j) + '*' + str(i) + '=' + str(i*j), end=' ')
print()
print('-' * 30)

# 3 九九乘法表 對齊

for i in range(1, 10):
for j in range(1, i+1):
product = i * j
product = str(product) + ' ' if j > 1 and product < 10 else str(product) #這裡用表示式(python推薦用)
print(str(j) + '*' + str(i) + '=' + product, end=' ')
print()
print('-' * 30)

# 4 九九乘法表 製表符對齊

for i in range(1, 10):
for j in range(1, i+1):
print(str(j) + '*' + str(i) + '=' + str(i*j), end='\t')
print()
print('-' * 30)

# 5 使用字串format方法

for i in range(1, 10):
line = ''
for j in range(1, i+1):
line += '{0}*{1}={2} '.format(j, i, i*j)
print(line)
print('-' * 30)

# 5 對齊

for i in range(1, 10):
line = ''
for j in range(1, i+1):
line += '{0}*{1}={2:<2} '.format(j, i, i*j)
print(line)
print('-' * 30)
  • {2:<2}對應i*j,:<2冒號是分割符號,

# 5 對齊改進

for i in range(1, 10):
line = ''
for j in range(1, i+1):
product = i * j
line += '{}*{}={}{}'.format(j, i, product, ' ' if j > 1 and product < 10 else ' ')
print(line)
print('-' * 30)

# 其它對齊

for i in range(1, 10): # row
for j in range(1, i+1): # column [1, i+1) 1 <= j <= i
print("{}*{}={}{}".format(j, i, i*j, ' ' if j==2 and i<5 else ''),
end='\n' if i == j else ' ')

743f757866cc803d788833467ad80dae.png

擴充套件題:

1*1=1  1*2=2  1*3=3  1*4=4  1*5=5  1*6=6  1*7=7  1*8=8  1*9=9
2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18
3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27
4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36
5*5=25 5*6=30 5*7=35 5*8=40 5*9=45
6*6=36 6*7=42 6*8=48 6*9=54
7*7=49 7*8=56 7*9=63
8*8=64 8*9=72
9*9=81
請列印成上面的形式

# 列印九九乘法表方陣的上半部分

for i in range(1, 10):
line = ''
print(' '*7*(i-1), end='') # 前置空格
for j in range(i, 10):
product = i * j
line += '{}*{}={}{}'.format(i, j, product, ' ' if product < 10 else ' ')
print(line)

下面採用右對齊方式,且分割均勻

for i in range(1, 10):
line = ''
for j in range(i, 10):
line += '{}*{}={:<{}}'.format(i, j, i * j, 2 if j < 4 else 3)
print('{:>66}'.format(line))

列印如下菱形

   *
***
*****
*******
*****
***
*

思路:

be6f0f92ad2aa8b34b8244bab6c3abf0.png

看到規律了嗎?

for i in range(-3,4):
if i<0:
prespace = -i
else:
prespace = i
print(' '*prespace + '*'*(7-prespace*2))

把if語句改成三元表示式的樣子,也可以使用abs(),內建絕對值函式

for i in range(-3, 4):
print(' ' * abs(i) + '*' * (7 - 2 * abs(i)))

居中列印

for i in range(-3, 4):
print("{:^7}".format('*'*(7-2*abs(i))))

當然菱形也可以居中列印,請自行完成

列印閃電

    *
**
***
********
***
**
*

分析如下:

行號  *個數  前空格  後空格數  總空格數  資料
1 1 3 3 6 -3
2 2 2 3 5 -2
3 3 1 3 4 -1
4 7 0 0 0 0
5 3 3 1 4 1
6 2 3 2 5 2
7 1 3 3 6 3

程式碼:

for i in range(-3, 4):
if i < 0:
print(' ' * (-i) + '*' * (4 + i))
elif i > 0:
print(' ' * 3 + '*' * (4 - i))
else:
print('*' * 7)

#延時擴充套件
n = 9
e = n // 2
x = n - e

for i in range(-e, x):
if i < 0:
print(' ' * -i + (x + i) * '*')
elif i > 0:
print(' ' * e + (x - i) * '*')
else: # i == 0
print('*' * n)

斐波那契數列,100以內

斐波那契數列_百度百科

斐波那契數列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...

如果設F(n)為該數列的第n項(n∈N*),那麼這句話可以寫成如下形式::F(n)=F(n-1)+F(n-2)

F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)

這是一個線性遞推數列

print(0)
print(1)
a = 0
b = 1

while True :
c = a + b
if c > 100 : break
a = b
b = c
print(c)

求斐波那契數列第101項

a = 1
b = 1
print('index={}, fib={}'.format(0, 0))
print('index={}, fib={}'.format(1, a))
print('index={}, fib={}'.format(2, b))
index = 2

while True:
c = a + b
index += 1
print('index={}, fib={}'.format(index, c))
if index == 101: break
a = b
b = c

# index=101, fib=573147844013817084101

求10萬內的所有素數

此題的目的是為了讓大家注意效率問題

for x in range(2,100):
for i in range(2,x):
if x % i == 0:
break
else:
print(x)

為什麼到一個數的“一半”就可以了

for x in range(2,100000):
for i in range(2,int(x ** 0.5)+1):
if x % i == 0:
break
else:
print(x)

下面這段程式碼是錯誤程式碼,用x=4測試,因為內層迴圈缺少2,那麼偶數就出了問題

for x in range(2,100000):
for i in range(3,int(x ** 0.5)+1,2):
if x % i == 0:
break
else:
print(x)

修改為

for x in range(3,100000,2): # 捨棄掉所有偶數
for i in range(3, int(x ** 0.5) + 1, 2): # 為什麼從3開始,且step為2?
if x % i == 0:
break
else:
print(x)

為什麼從3開始,且step為2?

既然沒有偶數,就不用和2取模了。

奇數%偶數能整除嗎

利用素數性質:所有大於10的質數中,個位數只有1,3,7,9。

count = 1
for x in range(3, 100000, 2): # 捨棄掉所有偶數
if x > 10 and x % 10 == 5: # 所有大於10的質數中,個位數只有1,3,7,9。意思就是大於5,結尾是5就能被5整除了
continue
for i in range(3, int(x ** 0.5) + 1, 2):
if x % i == 0:
break
else:
count += 1
print(x, count) # 9592

如何計算時間,import datetime

count = 0
for x in range(2,100000):
for i in range(2,x):
if x % i == 0:
break
else:
count += 1
print(count)
# 9592
count = 0
for x in range(2,100000):
for i in range(2,int(x ** 0.5)+1):
if x % i == 0:
break
else:
count += 1
print(count)
# 9592

應用在密碼學領域,都要使用大素數。

# 兩種演算法的對比的完整程式碼

import datetime

upper_limit = 100000
delta = [0,0]
counts = [0,0]

start = datetime.datetime.now()
for _ in range(10):
counts[0] = 0
for x in range(2,upper_limit):
for i in range(2,int(x ** 0.5)+1):
if x % i == 0:
break
else:
#print(x)
counts[0] += 1
delta[0] = (datetime.datetime.now() - start).total_seconds()

start = datetime.datetime.now()
for _ in range(10):
counts[1] = 1
#print(2)
for x in range(3,upper_limit,2):
for i in range(3,int(x ** 0.5)+1,2):
if x % i == 0:
break
else:
#print(x)
counts[1] += 1
delta[1] = (datetime.datetime.now() - start).total_seconds()

print(delta, sep="\t")
print(counts, sep="\t")

親,需要你的“分享”“在看”

fef64294b129d6207b6ec94d860af029.png

IT入門感謝關注

程式設計師題庫→程式設計師用的單詞表→練習地址:www.520mg.com/it