故事的起源:
故事的起源是這樣的,在我無聊地刷著網(wǎng)站(別想太多)的時候,叮咚一聲響,原來是女神來微信了,來向樂于助人的我請教題目:
據(jù)她說,這道題是她五年級的妹妹上奧數(shù)班做的題目。聽到這我不禁笑了,五年級,那不是 有手就行?我馬上啪啪啪敲下幾個字:很簡單,你等等先。
來看看題,題目是這樣的:
對于自然數(shù) a 和 b,規(guī)定 a ■ b = a × (a + 1) × (a + 2) × ??? × (a + b - 1) 。如果 (x ■ 3) ■ 2 = 3660 ,那么 x 等于幾?
解題
我們來縷一下思路:
對于新運(yùn)算 a ■ b ,用python或許可以這樣簡單地表示:
def math(a:int, b:int):
result = 1
for i in range(0, b):
result *= a + i
return result
原式可以化簡為:[x * (x + 1) * (x + 2)] * {[x * (x + 1) * (x + 2)] + 1} = 3660
有點(diǎn)麻煩。我們把中括號內(nèi)的式子用m表示,可以變成這樣:
m = x * (x + 1) * (x + 2)m * (m + 1) = 3660
這樣看來,要解這題,就必須解這個方程。那么……上面用python寫的那一串定義函數(shù),好像沒什么卵用?

啥也不說了,著手解方程!翻出我破舊的草稿紙,拿出卡水的筆,開始涂鴉。
不過,這可很難辦,由于我水平有限,我鼓搗了半天,愣是沒解出這串方程。但是,既然是女神請教,怎能連這題都做不出來?這時候我就想到了我們?nèi)f能的python。
馬上,開整!
打開百度,輸入 “用python解方程” :
馬上捕捉到關(guān)鍵信息點(diǎn):sympy庫
接下來開始用我們?nèi)f能的python來解這個難解的方程了。
sympy 解方程
1. 安裝sympy:
cmd 打開命令窗口,輸入以下指令:
pip install sympy
2. 使用
這里為了方便,我打開了我們 python 的 IDLE 的 shell:
首先導(dǎo)入sympy庫:
>>> import sympy
然后我們要設(shè)一個未知數(shù) x :
>>> x = sympy.Symbol('x')
接下來解方程:
通過移項(xiàng)、合并同類項(xiàng)等等等的一堆步驟后,將方程右邊化為0,變成方程左邊等于 0 的形式(你也可以直接用-連接方程兩邊),然后用solve方法解方程,放入式子和未知數(shù):
>>> sympy.solve((x * (x + 1) * (x + 2) * ((x * (x + 1) * (x + 2)) + 1)) - 3660, x)
當(dāng)然,也可以解方程組,將方程組和待解的未知數(shù)分別用中括號括起來,比如這樣:
>>> x = sympy.Symbol('x')
>>> m = sympy.Symbol('m')
>>> e1 = x * (x + 1) * (x + 2) - m
>>> e2 = m * (m + 1) - 3660
>>> sympy.solve([e1, e2], [x, m])
然后,將會返回一個列表,里面就是方程的所有解。
結(jié)果……

……這這這……這是什么鬼玩意嘛??。?!看著就頭皮發(fā)麻
還好,題目說著,a, b 為自然數(shù),所以 x 大于等于 0 且為整數(shù),那么,自然就只有一個答案,即列表的第一項(xiàng):
3
趕緊發(fā)給我的女神:
于是,便開始了愉快的撩……,哦不,聊天與教學(xué)之旅。

總結(jié)
SymPy 是一個Python的科學(xué)計(jì)算庫,有著一套強(qiáng)大的符號計(jì)算體系。它的目標(biāo)是成為一個全功能的計(jì)算機(jī)代數(shù)系統(tǒng),同時保持代碼簡潔、易于理解和擴(kuò)展。它完全由 Python 寫成,不依賴于外部庫。除了解方程,SymPy 還支持符號計(jì)算、高精度計(jì)算、模式匹配、繪圖、微積分、組合數(shù)學(xué)、離散數(shù)學(xué)、幾何學(xué)、概率與統(tǒng)計(jì)、物理學(xué)等多方面的功能。遇到復(fù)雜計(jì)算找 Sympy 絕對不會讓你失望。
附在最后:
其實(shí)上面寫的那個math函數(shù),還是有一點(diǎn)點(diǎn)用處的,它依然可以用來解這一道題。首先,因?yàn)?a 和 b 為自然數(shù),那么他們就為大于零的整數(shù),因此可以使用最蠢也是最簡單的辦法——代入法,來解這一道題:
def math(a:int, b:int):
result = 1
for i in range(0, b):
result *= a + i
return result
x = 0
while True:
if math(math(x, 3), 2) == 3660:
print(x)
break
else:
x += 1
很快就能得到正確結(jié)果: 3
還有……
在我送別了女神,繼續(xù)一個人孤獨(dú)地刷網(wǎng)站的時候……
叮咚!
哈哈哈哈,真是想清靜都清靜不下來啊~~

CSDN同名搜 H_612,看更多Python文章!
CSDN博客:https://blog.csdn.net/weixin_52132159?spm=1011.2124.3001.5343