從水仙花數到自戀數-01-自戀數的初識
0-簡介:
在數論中,水仙花數(Narcissistic number,也被稱為超完全數字不變數(pluperfect digital invariant,PPDI),自戀數,自冪數,阿姆斯壯數或阿姆斯特朗數(Armstrong number)用來描述一個N位非負整數,其各位數字的N次方和等於該數本身.
1-定義:
設有自然數n,d為該自然數各位數字,即 n = dkdk-1...d1 ,則有:
n = dk·10k-1 + dk-1·10k-2 + ... + d2·10 + d1,
如果該自然數n滿足條件:
n = dkk + dk-1k + ... + d2k + d1k.
則這個自然數就被稱為超完全數字不變數。
若將條件放寬,一個N位數,其各個數之M次方和等於該數,M和N不一定相等,這樣的數稱為完全數字不變數
水仙花數一定是完全數字不變數,但完全數字不變數不一定是水仙花數。 嚴格意義來說水仙花數指三位數.
補充說明:
在百度百科中,不同位數的自冪數擁有不同的稱呼,但是這個稱呼應該是只有中國才有的這個叫法,不信你看這些名字有哪一個是國際化的:
我甚至懷疑是不是網友或者寫百度百科的人自己瞎取的.
2-"八卦":
我們要說的八卦當然是關於自冪數的八卦:
1. 十進位的自冪數一共89個,其中最大的有39位: 115,132,219,018,763,992,565,095,597,973,971,522,401;
2. 十二進制的完美數: 25, A5, 577, 668, A83, 14765, 938A4;
3. 三進位中的這樣的數有:0、1、2、12、122;
4. 四進位中的這樣的數有:0、1、2、3、313;
5. 任何進制之下1-9都是自冪數
6. 更多關於自戀數的信息可以查看OIES-A005188
3-代碼實現(基於C++):
// C++代碼實現: #include <iostream> #include <cmath> using namespace std; int main(int argc, char const *argv[]) { // digits: 位寬,每一個數的位數 for (int digits = 3; digits < 10; digits++) { // next:被測試的數字 for (int next = pow(10, digits - 1); next < pow(10, digits) - 1; next++) { int temp = next; // temp: 臨時變量,用來保護原數據next不被破壞(改變)影響下一次的循環 int sum = 0; // 每個數位上的數字次方和 while (temp > 0) { sum += pow((temp % 10), digits); temp /= 10; // 由於temp為int類型,所以除以10之後會自動截去小數部分(是截去,不是四捨五入) } if (sum == next) { // 判斷是否滿足條件 cout << next << endl; } } } return 0; }
說明:
這裡的代碼只是簡單的實現了查找并輸出9位數以內的自冪數,尚未對程序進行優化(不管是算法上還是代碼格式,命名規範等方面均是如此);其優化我會放在後面的文章之中.屆時除了代碼的優化還有關於自冪數更多的事情.因為這個分類的重點本來就不是在於代碼,而是在於學習和進步.