檢查一個數是否為自戀數
自戀數是一種具有獨特性質的特殊數字。如果一個數的各位數字分別乘以其自身次方之和等於該數本身,則該數被認為是自戀數。這些數字並不常見,已知的也不多。如果使用定義 00 = 0,則 0 也可以被認為是一個自戀數。
以下文章提供了一種方法來確定一個數是否為自戀數,同時牢記自戀數的這些特性。
問題陳述
手頭上的任務是檢查給定的整數 n 是否為自戀數,即當每個數字都乘以其自身次方並求和時,結果是否等於原始數字。如果它是自戀數,程式應該返回 true,否則應該返回 false。
示例
Input: 1 Output: True
解釋 − (1 的 1 次方) = 11 = 1。
由於結果數字等於原始數字,因此 1 是一個自戀數。
Input: 1603 Output: False
解釋 − (1 的 1 次方) + (6 的 6 次方) + (0 的 0 次方) + (3 的 3 次方) = 11 + 66 + 00 + 33 ≠ 1603 。
這等於 46684。由於結果數字不等於原始數字,因此 1603 不是自戀數。
Input: 3435 Output: True
解釋 − (3 的 3 次方) + (4 的 4 次方) + (3 的 3 次方) + (5 的 5 次方) = 33 + 44 + 33 + 55 = 3435。
由於結果數字等於原始數字,因此 3435 是一個自戀數。
Input: 4335 Output: False
解釋 − (4 的 4 次方) + (3 的 3 次方) + (3 的 3 次方) +(5 的 5 次方) = 44 + 33 + 33 + 55 ≠ 4335。
由於結果數字不等於原始數字,因此 4335 不是自戀數。
解決方案方法
為了確定提供的數字是否為自戀數,我們必須知道每個數字乘以其自身次方之和是否與原始數字相同。以下方法可用於計算總和並確定結果是否與原始數字匹配。
演算法
該方法包括以下步驟 −
將給定的數字分解成其各位數字。
將每個數字乘以其自身次方。
將結果相加。
將總和與原始數字進行比較。
顯示答案。
虛擬碼
函式 is_munchhausen()
初始化 sum = 0
初始化 temp = n
當 (temp > 0)
初始化 digit = temp % 10
sum = sum + pow(digit, digit)
temp = temp / 10
返回 sum == n
函式 main()
初始化 n
如果 (is_munchhausen())
cout << “自戀數”
否則
cout << “非自戀數”
列印輸出
示例:C++ 程式
該程式透過呼叫 is_munchhausen() 函式來確定一個數是否為自戀數。該函式使用一個等於 n 的臨時變數和另一個變數 sum 來儲存每個數字乘以其自身次方結果的總和。
在迴圈的每次迭代中,使用 ‘%’ 運算子訪問 temp 的每個個位數字。它返回數字的最右邊的數字。然後將該數字乘以其自身次方並新增到 sum 中。在每次迭代結束時,temp 除以 10 以訪問下一個數字。迴圈執行直到 temp > 0。
// C++ code for Münchhausen Number #include <iostream> #include <cmath> using namespace std; // this function is used to check out whether the given number is Münchhausen Number or not bool is_munchhausen(int n){ int sum = 0; int temp = n; while (temp > 0){ int digit = temp % 10; //yields the rightmost digit as remainder sum = sum + pow(digit, digit); temp = temp / 10; // yields the remaining number } return (sum == n); // returns true if sum is equal to original number } // Driver Code int main(){ int n = 3253; cout << "input number: " << n << endl; if (is_munchhausen(n)){ cout << "Münchhausen Number" << endl; } else { cout << "Non-Münchhausen Number" << endl; } return 0; }
輸出
input number: 3253 Non-Münchhausen Number
時間和空間複雜度分析
時間複雜度 − O(log n) 時間複雜度,其中 n 是輸入引數的值。這是因為函式 is_munchhausen() 中 while 迴圈的迭代次數取決於給定數字的位數,這與以 10 為底的對數 log(n) 成正比。該函式在主函式中呼叫一次,因此程式的整體複雜度與 log(n) 成正比。
空間複雜度 − O(1)。此函式使用固定數量的記憶體來儲存整數變數 sum 和 temp,而不管輸入引數的大小如何,因此其空間複雜度是常數。
結論
總之,自戀數是唯一用其各位數字分別乘以其自身次方之和表示的數字。它們並不常見,找到它們可能是一項艱鉅的任務。本文討論的解決方案方法提供了一種方法,可以在對數時間內輕鬆檢查一個數是否為自戀數,而無需使用輔助空間。本文使用各種示例深入解釋了自戀數的概念。可以使用附帶的 C++ 程式碼快速確定給定數字是否為自戀數。