檢查一個數是否為自戀數


自戀數是一種具有獨特性質的特殊數字。如果一個數的各位數字分別乘以其自身次方之和等於該數本身,則該數被認為是自戀數。這些數字並不常見,已知的也不多。如果使用定義 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++ 程式碼快速確定給定數字是否為自戀數。

更新於: 2023-04-19

547 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

立即開始
廣告