Munchausen Number

Internship at OpenGenus

Get FREE domain for 1st year and build your brand new site

A number that is equal to the sum of its digits each raised to the power equal to its digit is a Munchausen Number or perfect digit-to-digit invariant(PDDI).

For example :

number

1.In above example each digit raised to itself on addition equals to number itself.

2.Another number which exhibits this property is 1 .

Pseudocode

So a simple algorithm for identification of Munchausen Number is as follows:

  • For a given input number break it into constituent digits.
  • Find the sum of each of its digits raised to itself.
  • If it is equal to the original number,then it is the required Munchausen number.

Implementation

For example let's try to find if a number is a Munchausen number or not?
We make use of our psudeo code for breaking the problem.

The Cpp implementation is as follows :

#include<bits/stdc++.h>
using namespace std; 
int pwr[10]; //global variable
bool isMunchausen(int n) { 
//Precomputing i raised to power i for every i (0-9)
for (int i = 0; i <= 9; i++ ) 
{
   pwr[i] = pow( i,i );
} 
int sum = 0; 
int temp = n; 
while (temp)
{ 
 sum =sum + pwr[(temp % 10)]; 
 temp =temp/10; 
}
return (sum == n); 
} 
int main() { 
int n=1000;
 
if(isMunchausen(n))//function call
{cout<<"YES"<<endl;}
else
{cout<<"NO"<<endl;} 
return 0; 
}

Output

NO

Ex 2 : Now let's try to find over a range of numbers
We extend the same approach used over a set of numbers to get the desired result .
The Cpp implementation of it is as follows:

#include <bits/stdc++.h>
using namespace std; 
int pwr[10]; //global variable for accessing the values
void printNumbers(int n) 
{ 
	//Precomputing i raised to power i for every i (0-9) 
	for (int i = 0; i <= 9; i++ ) 
	{
	pwr[i] = pow( i,i );} 
	// checking up to n 
	for (int i = 1; i <= n; i++) 
        {
	if (isMunchausen(i)) 
	cout << i << "\n"; //if true prints the number
	}
} 
bool isMunchausen(int n) { 
	int sum = 0; 
	int temp = n; 

	while (temp) { 
	sum =sum + pwr[(temp % 10)]; //Adding the units digit to the count 
	temp =temp/10; //Breaking the number for next higher power extraction
	}
	return (sum == n); 
} 

int main() { 
	int n = 10000; //change here for computing other numbers 
	printNumbers(n); 
	return 0; 
}

Output

1
3435

In above examples 0^0=0 is considered.

Conclusions :

There are a very few numbers greater than zero which are Munchausen numbers or PDDI like 1 , 3435 and 438579088. The gap widens so on so forth from our observation.