從水仙花數到自戀數-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位數以內的自冪數,尚未對程序進行優化(不管是算法上還是代碼格式,命名規範等方面均是如此);其優化我會放在後面的文章之中.屆時除了代碼的優化還有關於自冪數更多的事情.因為這個分類的重點本來就不是在於代碼,而是在於學習和進步.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用