數學黑洞 卡普雷卡爾常數的php演算法實現

2022-06-21 10:12:09 字數 3518 閱讀 9935

首先看一篇文章:

英國廣播公司報道,6174乍看沒什麼奇特之處,但是,自從2023年以來,它一直令數學家、數字控抓狂、痴迷。

不管你挑的四位數是什麼,早早晚晚你都會遇到6174;而且,遇到6174就只能止步,否則面臨的將是無休無止的無用功了。

祝賀一下,現在你總算搞懂了卡普雷卡爾常數(kaprekar's constant,又稱卡布列克常數)。

印度數學家卡普雷卡爾(1905-1986)最喜歡擺弄數字,正是他發現了6174的神奇魅力。

自認數字理論控的卡普雷卡爾2023年在印度城市馬德拉斯召開的一次數學會議上向世界宣布了自己的發現。

卡普雷卡爾就讀於孟買大學,畢業後在孟買北部山區小鎮帶奧拉利(devlali)當老師。

印度數學家認為,卡普雷卡爾的發現很無聊,取笑一番,置之不理。不過,卡普雷卡爾是位高產作家,經常在大眾科普刊物上發表文章。而且,他還常被請去參加各種會議、在學校巡迴演說,介紹自己獨特的方法和有趣的發現。

逐漸,卡普雷卡爾在國內外知名度、受歡迎程度越來越高。到了2023年,美國暢銷書作家、數學愛好者martin gardner在著名科普雜誌《科學美國人》上發表文章介紹卡普雷卡爾。

現在,卡普雷卡爾的名字在全世界數學愛好者——特別是數字控中——已經是如雷貫耳。

日本大阪經濟大學教授西山豊(yutaka nishiyama)認為,6174真是個「謎一樣的數字」。在一篇網上文章中,西山教授解釋說,他用電腦查證是否所有的四位數都能在有限步驟內得出6174。

他的發現是,根據卡普雷卡爾的演算法,所有四位數(只要四位數不重複)最多隻需要7步運算就會得出6174。

「如果7步還沒有得出6174,那一定是你算錯了。重來一遍吧。」

把下面的**儲存為 index.php 存入伺服器中,在瀏覽器中每重新整理一次,程式會隨機取出四位數進行卡普雷卡爾常數運算十步。

(一)面向過程實現:

<?php /**

* 卡普雷卡爾常數的計算(6174的數字黑洞)

* * 計算方法:任意四個不重複的一位數,它們組成的最大四位數減去它們組成的

* 最小四位數所得的新四位重複前面的演算法,最多七次就會得到6174。

*///隨機數產生四位原始數字的陣列

$original = array( rand(1,9), rand(1,9), rand(1,9), rand(1,9));

$orig = implode( $original

);echo "

原資料:

";/*

* * $total[0]存放計算前的四位數

* $total[1]存放計算後的四位數

* $total[2]存放計算得到6174後的計算次數

*/$total = array( 0, 0, 0);

$tag = true;/*

* * 整個計算就是乙個 for 迴圈加 3 個函式完成的

* 計算 10 次資料

*/for( $i = 0; $i

< 10; $i++)

$total[0] = $total[1];

}echo '在第' . $total[2] . '步使資料等於6174。

';/*

* * 氣泡排序演算法函式

* ( php有原生的排序函式 sort() 公升序和 rsort() 降序排序 )

* * @param array $arr 要排序的陣列;

* @param bool $order 為 true 公升序,為 false 降序。

* @return array

*/function sortfunc($arr, $order = true

) }

else}}

}return

$arr;}

/*** 卡普雷卡爾常數的計算函式

* * 功能:任意四位數,排序後的最大數減去排序後的最小數。

* @param array $arr 輸入的任意四位數。

* @return integer

*/function calculation( $arr)/*

* * 數字拆分成陣列函式

* * @param integer $num 四位數如:8543

* @return array 得到的陣列如:array( 8, 5, 4, 3 )

* 如果用原生 php 函式是 str_split()

*/function numtoarr( $num

)

return

$arr

;}

(二)用物件導向實現上面的面向過程:

<?php /**

* 卡普雷卡爾常數的計算(6174的數字黑洞)

* * 計算方法:任意四個不重複的一位數,它們組成的最大四位數減去它們組成的

* 最小四位數所得的新四位重複前面的演算法,最多七次就會得到6174。

*/class

kaprekarconst

public

function

main()

$this->total[0] = $this->total[1];

}return

$this->val;

}/**

* 卡普雷卡爾常數的計算方法

** 功能:任意四位數,排序後的最大數減去排序後的最小數。

* @param array $arr 輸入的任意四位數。

* @return integer

*/public

function calculation( $arr

) /**

* 數字拆分成陣列方法

* * @param integer $num 四位數如:8543

* @return array 得到的陣列如:array( 8, 5, 4, 3 )

* 如果用原生 php 函式是 str_split()

*/public

function numtoarr( $num

)

return

$arr

; }

}$obj = new

kaprekarconst;

$val = $obj->main();

//顯示內容:

echo '原資料:' . $val[0] . '

';foreach( $val[1] as

$value

)echo '在第' . $val[2] . '步使資料等於6174。';

程式執行後的效果:

卡普雷卡數

傳說數學家卡普雷卡 kaprekar 偶然發現鐵路旁的里程碑 3025 被雷擊得一分為二 30與25.他敏銳地注意到 30 25 55,55 2 3025。現稱這樣具有分段和平特性的整數為卡普雷卡數。先 搜尋4位卡普雷卡數的基礎上引申至一般偶數字卡普雷卡數,並進一步拓廣到2段和平方數。乙個4位整數分...

JS 卡牌分組 陣列 數學

給定一副牌,你需要將整副牌分成 1 組或多組。要求 每組牌數量相等 組內每張牌數字相等,僅當你可選的 x 2 時返回 true。輸入 1,2,3,4,4,3,2,1 輸出 true 解釋 可行的分組是 1,1 2,2 3,3 4,4 輸入 1,1,2,2,2,2 輸出 true 解釋 可行的分組是 ...

卡雷爾機械人作業3

我們需要操縱卡雷爾使用灰色方塊,將空白矩形變成跳棋板,前後效果圖如下 這道題的分步結構非常清晰,演算法本身也很有趣。你需要保證卡雷爾能在各種規格的棋盤上 正確執行操作,而不僅是本題中8 8 的標準樣式。奇數長寬的棋盤處理起來比較麻煩,你 的程式在5 3 棋盤上應該生成如下圖案 另外乙個需要考慮的特殊...