相信每個男人都有過“金戈鐵馬,氣吞萬里如虎”的想象
假如有一天,你穿越到楚漢相爭時期成為韓信......
話說秦朝末年,楚漢相爭。有一次,韓信帶領1500名將士與楚王大將李鋒交戰。苦戰一場,楚軍不敵,敗退回營,漢軍也死傷四五百人,於是,韓信整頓兵馬也返回大本營。
當行至一山坡,忽有後軍來報,說有楚軍騎兵追來。只見遠方塵土飛揚,殺聲震天。漢軍本來已十分疲憊,這時隊伍大譁。韓信兵馬到坡頂,見來敵不足五百騎,便急速點兵迎敵。
他命令士兵3人一排,結果多出2名;接著命令士兵5人一排,結果多出3名;他又命令士兵7人一排,結果又多出2名。
韓信馬上向將士們宣佈:我軍有1073名勇士,敵人不足五百,我們居高臨下,以眾擊寡,一定能打敗敵人。漢軍本來就信服自己的統帥,這一來更認為韓信是“神仙下凡”、“神機妙算”。於是士氣大振。一時間旌旗搖動,鼓聲喧天,漢軍步步進逼,楚軍亂作一團。交戰不久,楚軍大敗而逃。
那麼問題來了,韓信是如何知道將士的人數的呢? 假如有一天,你穿越到古代成為韓信,身邊只有一臺裝有EXCEL的電腦,你能夠帶領將士殺出重圍嗎?
我們先把問題翻譯成數學語言:已知一個正整數X,1000
咋一看,用EXCEL似乎辦不到呀,我們先用一個笨方法來解決,窮舉!從1000驗算到1100,不就100個數嘛!
1000=3*333+1,一看就不對,下一個
1001=3*333+2,誒,對了,繼續,1001=5*200+1,不對......
Oh,My God,我佛真主耶穌保佑,這得算到何年何月!可這正是電腦擅長的呀,來看EXCEL是怎麼算的:
解法一
我們現在A列列出1000至1100的數字,然後分別在B,C,D列對3、5、7取餘數,如果餘數分別等於2,3,2就恰好得到了我們的將士人數,
公式為:=MOD($A2,B$1)
驗證公式為:=IF((B2=2)*(C2=3)*(D2=2),"將士總人數為:"&A2,"不符要求")
這樣就求出了我們的將士總人數,借用EXCEL,你也可以帶兵打仗啦!
解法二
有些同學可能會說,這樣求解表格太大了,不夠優雅,我們來個優雅的!在EXCEL中任意單元格輸入以下公式:
="將士總人數為:"&SUMPRODUCT(ROW(1000:1100),(MOD(ROW(1000:1100),3)=2)*(MOD(ROW(1000:1100),5)=3)*(MOD(ROW(1000:1100),7)=2))
是不是超級神奇?這個函數的思路和上面的思路是一致的,都是枚舉法的運用,其計算過程可分為以下幾步:
第一步:ROW(1000:1100):生成1000~1100的數組
第二步:用MOD函數分別對其取餘
第三步:當餘數同時滿足除3餘2,除5餘3,除7餘2時,即得到將士人數
本文涉及的函數主要有:
MOD,求餘函數,語法:MOD(被除數,除數)
IF,條件函數,語法:IF(邏輯條件,事件A,[事件B]),當邏輯條件為真時,返回事件A,反之,返回事件B
SUMPRODUCT,數組相乘再求和,語法:SUMPRODUCT(數組1,[數組2]......)
ROW,返回單元格的行號,語法:ROW(單元格引用)
本文涉及的函數都是基礎函數,結合起來卻有妙用,函數是基礎,算法思維才是根本,理解背後的邏輯,解題易如反掌!
問題延伸
“韓信點兵”問題又被稱為“中國剩餘定理”、“大衍求一術”、“鬼谷算”等,和《九章算術》中的“物不知數”問題為同類問題,屬於現代數論中求解一次同餘式方程組問題,
秦九韶所發明的“大衍求一術”,即現代數論中一次同餘式組解法,是中世紀世界數學的最高成就,比西方1801年著名數學家高斯(Gauss,1777—1855年)建立的同餘理論早554年,被西方稱為“中國剩餘定理”。秦九韶不僅為中國贏得無上榮譽,也為世界數學作出了傑出貢獻。若您有興趣,可作進一步瞭解!
歡迎留言探討
我是 EXCEL精選技巧,每天帶您學習一個EXCEL精選技巧,實用,乾貨更有趣!
閱讀更多 Excel精選技巧 的文章