A Krishnamurthy number is a number whose sum of the factorial of digits is equal to the number itself.
For example, 145 is the sum of the factorial of each digit.
1! + 4! + 5! = 1 + 24 + 120 = 145
Examples:
Input : 145
Output : YES
Explanation: 1! + 4! + 5! =
1 + 24 + 120 = 145, which is equal to input,
hence YES.Input : 235
Output : NO
Explanation: 2! + 3! + 5! =
2 + 6 + 120 = 128, which is not equal to input,
hence NO.
The idea is simple, we compute the sum of factorials of all digits and then compare the sum with n.
// C++ program to check if a number
// is a krishnamurthy number
#include <bits/stdc++.h>
using namespace std;
// Function to calculate the factorial of any number
int factorial(int n)
{
int fact = 1;
while (n != 0) {
fact = fact * n;
n--;
}
return fact;
}
// function to Check if number is krishnamurthy
bool isKrishnamurthy(int n)
{
int sum = 0;
int temp = n;
while (temp != 0) {
// calculate factorial of last digit
// of temp and add it to sum
sum += factorial(temp % 10);
// replace value of temp by temp/10
temp = temp / 10;
}
// Check if number is krishnamurthy
return (sum == n);
}
// Driver code
int main()
{
int n = 145;
if (isKrishnamurthy(n))
cout << "YES";
else
cout << "NO";
return 0;
}
// Java program to check if a number
// is a krishnamurthy number.
import java.util.*;
import java.io.*;
class Krishnamurthy {
// function to calculate the factorial
// of any number
static int factorial(int n)
{
int fact = 1;
while (n != 0) {
fact = fact * n;
n--;
}
return fact;
}
// function to Check if number is krishnamurthy
static boolean isKrishnamurthy(int n)
{
int sum = 0;
int temp = n;
while (temp != 0) {
// calculate factorial of last digit
// of temp and add it to sum
sum += factorial(temp % 10);
// replace value of temp by temp/10
temp = temp / 10;
}
// Check if number is krishnamurthy
return (sum == n);
}
// Driver code
public static void main(String[] args)
{
int n = 145;
if (isKrishnamurthy(n))
System.out.println("YES");
else
System.out.println("NO");
}
}
# Python program to check if a number
# is a krishnamurthy number
# function to calculate the factorial
# of any number
def factorial(n) :
fact = 1
while (n != 0) :
fact = fact * n
n = n - 1
return fact
# function to Check if number is
# krishnamurthy/special
def isKrishnamurthy(n) :
sum = 0
temp = n
while (temp != 0) :
# calculate factorial of last digit
# of temp and add it to sum
rem = temp%10
sum = sum + factorial(rem)
# replace value of temp by temp / 10
temp = temp // 10
# Check if number is krishnamurthy
return (sum == n)
# Driver code
n = 145
if (isKrishnamurthy(n)) :
print("YES")
else :
print("NO")
# This code is contributed by Prashant Aggarwal
// C# program to check if a number
// is a krishnamurthy number.
using System;
class GFG {
// function to calculate the
// factorial of any number
static int factorial(int n)
{
int fact = 1;
while (n != 0) {
fact = fact * n;
n--;
}
return fact;
}
// function to Check if number is
// krishnamurthy
static bool isKrishnamurthy(int n)
{
int sum = 0;
int temp = n;
while (temp != 0) {
// calculate factorial of
// last digit of temp and
// add it to sum
sum += factorial(temp % 10);
// replace value of temp
// by temp/10
temp = temp / 10;
}
// Check if number is
// krishnamurthy
return (sum == n);
}
// Driver code
public static void Main()
{
int n = 145;
if (isKrishnamurthy(n))
Console.Write("YES");
else
Console.Write("NO");
}
}
// This code is contributed by nitin mittal.
<script>
// Javascript program to check if a number
// is a krishnamurthy number
// Function to find Factorial
// of any number
function factorial(n)
{
let fact = 1;
while (n != 0)
{
fact = fact * n;
n--;
}
return fact;
}
// Function to check if number
// is krishnamurthy
function isKrishnamurthyNumber(n)
{
let sum = 0;
// Storing the value in
// other variable
let temp = n;
while (temp != 0)
{
// Calculate factorial of last digit
// of temp and add it to sum
sum = sum + factorial(temp % 10);
// Integer Division
// replace value of temp by temp/10
temp = parseInt(temp / 10);
}
// Check if number is krishnamurthy
return sum == n;
}
// Driver code
let n = 145;
if (isKrishnamurthyNumber(n))
document.write("YES");
else
document.write("NO");
// This code is contributed by _saurabh_jaiswal
</script>
<?php
// PHP program to check if a number
// is a krishnamurthy number
// Function to find Factorial
// of any number
function factorial($n)
{
$fact = 1;
while($n != 0)
{
$fact = $fact * $n;
$n--;
}
return $fact;
}
// function to Check if number
// is krishnamurthy
function isKrishnamurthyNumber($n)
{
$sum = 0;
// Storing the value in
// other variable
$temp = $n;
while($temp != 0)
{
// calculate factorial of last digit
// of temp and add it to sum
$sum = $sum + factorial($temp % 10);
// Integer Division
// replace value of temp by temp/10
$temp = intdiv($temp, 10);
}
// Check if number is krishnamurthy
return $sum == $n;
}
// Driver code
$n = 145;
if (isKrishnamurthyNumber($n))
echo "YES";
else
echo "NO";
// This code is contributed by akash7981
?>
Output
YES
Time Complexity: O(n log10n) where n is a given number
Auxiliary Space: O(1)
Interestingly, there are exactly four Krishnamurthy numbers i.e. 1, 2, 145, and 40585 known to us.
Approach 2: Precomputing factorials and checking each digit of the number against the precomputed factorials.
- The declaration int factorial[10]; creates an array factorial of 10 integers to store the precomputed factorials.
- The precomputeFactorials() function calculates and stores the factorials of numbers 0 to 9 in the factorial array. It uses a for loop to iterate through each number and calculates its factorial by multiplying it with the factorial of the previous number.
- The isKrishnamurthy(int n) function takes an integer n as input and checks if it is a Krishnamurthy number or not. It first declares a variable sum to store the sum of factorials of digits in n and a variable temp to store a copy of n.
- It then enters a while loop that continues until temp becomes zero. In each iteration of the loop, it calculates the rightmost digit of temp using the modulo operator (temp % 10) and adds the factorial of that digit to sum. It then updates the value of temp by removing the rightmost digit using integer division (temp /= 10).
- After the while loop completes, the function returns true if sum is equal to n, indicating that n is a Krishnamurthy number, or false otherwise.
- In the main() function, we call precomputeFactorials() to precompute the factorials of numbers 0 to 9 and store them in the factorial array.
- We then set n to 145, which is a Krishnamurthy number, and call isKrishnamurthy(n) to check if n is a Krishnamurthy number or not.
- Finally, we use cout to print "YES" if isKrishnamurthy(n) returns true, indicating that n is a Krishnamurthy number, or "NO" otherwise. We also use endl to insert a newline character after the output.
#include <iostream>
using namespace std;
int factorial[10];
void precomputeFactorials() {
factorial[0] = 1;
for (int i = 1; i < 10; i++) {
factorial[i] = i * factorial[i-1];
}
}
bool isKrishnamurthy(int n) {
int sum = 0;
int temp = n;
while (temp > 0) {
int digit = temp % 10;
sum += factorial[digit];
temp /= 10;
}
return (sum == n);
}
int main() {
precomputeFactorials();
int n = 145;
if (isKrishnamurthy(n)) {
cout <<"YES" << endl;
} else {
cout <<"NO" << endl;
}
return 0;
}
// This is the Java code which checks if a given
// number is a Krishnamurthy number or not.
//A Krishnamurthy number is a number whose sum of factorials
// of its digits is equal to the number itself
import java.util.Arrays;
public class KrishnamurthyNumber {
// Declare an array to store factorials of digits 0-9
static int[] factorial = new int[10];
// Function to precompute the factorials and store them
// in the array
public static void precomputeFactorials()
{
factorial[0] = 1;
for (int i = 1; i < 10; i++) {
factorial[i] = i * factorial[i - 1];
}
}
// Function to check if a given number is a
// Krishnamurthy number or not
public static boolean isKrishnamurthy(int n)
{
int sum = 0;
int temp = n;
// Compute the sum of factorials of digits of the
// number
while (temp > 0) {
int digit = temp % 10;
sum += factorial[digit];
temp /= 10;
}
// Check if the sum of factorials is equal to the
// input number
return (sum == n);
}
public static void main(String[] args)
{
// Compute the factorials using
// precomputeFactorials() function
precomputeFactorials();
int n = 145;
// Check if 145 is a Krishnamurthy number using
// isKrishnamurthy() function
if (isKrishnamurthy(n)) {
System.out.println("YES");
}
else {
System.out.println("NO");
}
}
}
# Precompute factorials of digits 0-9
factorial = [1] * 10
def precompute_factorials():
for i in range(1, 10):
factorial[i] = i * factorial[i-1]
precompute_factorials()
# Check if a number is a Krishnamurthy number
def is_krishnamurthy(n):
# Compute sum of factorials of digits
sum = 0
temp = n
while temp > 0:
digit = temp % 10
sum += factorial[digit]
temp //= 10
# Check if sum equals the original number
return (sum == n)
# Test if a given number is a Krishnamurthy number
n = 145
if is_krishnamurthy(n):
print("YES")
else:
print("NO")
using System;
namespace KrishnamurthyNumber
{
class Program
{
static int[] factorial = new int[10];
static void precomputeFactorials()
{
factorial[0] = 1;
for (int i = 1; i < 10; i++)
{
factorial[i] = i * factorial[i - 1];
}
}
static bool isKrishnamurthy(int n)
{
int sum = 0;
int temp = n;
while (temp > 0)
{
int digit = temp % 10;
sum += factorial[digit];
temp /= 10;
}
return (sum == n);
}
static void Main(string[] args)
{
precomputeFactorials();
int n = 145;
if (isKrishnamurthy(n))
{
Console.WriteLine("YES");
}
else
{
Console.WriteLine("NO");
}
}
}
}
let factorial = [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880];
function precomputeFactorials() {
for (let i = 1; i < 10; i++) {
factorial[i] = i * factorial[i-1];
}
}
function isKrishnamurthy(n) {
let sum = 0;
let temp = n;
while (temp > 0) {
let digit = temp % 10;
sum += factorial[digit];
temp = Math.floor(temp / 10);
}
return (sum === n);
}
precomputeFactorials();
let n = 145;
if (isKrishnamurthy(n)) {
console.log("YES");
} else {
console.log("NO");
}
Output
YES
Time Complexity: O(logN)
Auxiliary Space: O(1)