沒想到我連五年級的題目都解不出來……

故事的起源:

故事的起源是這樣的,在我無聊地刷著網(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é)果……


結(jié)果

……這這這……這是什么鬼玩意嘛??。?!看著就頭皮發(fā)麻
還好,題目說著,a, b 為自然數(shù),所以 x 大于等于 0 且為整數(shù),那么,自然就只有一個答案,即列表的第一項(xiàng):

3

趕緊發(fā)給我的女神:


發(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容