Numéro spécial en Java
Dans cet article, nous allons écrire un programme Java pour vérifier si le numéro donné est un numéro spécial ou non ? Nous développerons également un programme Java pour afficher tous les numéros spéciaux qui existent dans la plage/l'intervalle donné.
Si la somme de la factorielle de tous les chiffres d'un nombre est égale au nombre d'origine, le nombre est appelé numéro spécial. Par exemple :- 145 et 40585 sont des nombres de Krishnamurthy.
145
=> 1 ! + 4 ! + 5 !
=> 1 + 24 + 120
=> 145
La somme de la factorielle des chiffres individuels est la même que le nombre d'origine 145. Par conséquent, 145 est un nombre spécial.
De même,
40585
=> 4 ! + 0 ! + 5 ! + 8 ! + 5 !
=> 24 +1 + 120 + 40320 + 120
=> 40585
Donc, 40585 est aussi un numéro spécial
1! =1
Donc, 1 est aussi un nombre spécial.
De même,
2 ! =1*2 =2
2 est aussi un nombre spécial.
D'où les nombres 1, 2, 145 et 40585 sont les exemples de Numéro spécial.
Parfois, le numéro spécial est également appelé numéro fort, numéro de Krishnamurthy et numéro de Peterson.
Procédure pour développer une méthode pour vérifier si le numéro est un numéro spécial ou non
1) Prendre un nombre en entrée
2) Prendre une variable somme et l'initialiser avec 0
3) Trouver le dernier chiffre du nombre
4) Calculer la factorielle de ce dernier chiffre
5) Ajoutez le résultat factoriel dans la somme
6) Supprimez le dernier chiffre du nombre
7) Répétez les étapes 3 à 6 jusqu'à ce que le nombre devienne 0.
8) Si la somme est égale à l'entrée (numéro) alors c'est un numéro spécial
import java.util.Scanner;
public class SpecialNumber {
// method to Check the Special number
public static boolean isSpecial(int number) {
// declare variables
int sum = 0, lastDigit = 0;
int tempNum = number;
// traverse through all digits of number
while(tempNum != 0) {
lastDigit = tempNum % 10;
sum += factorial(lastDigit);
tempNum /= 10;
}
// compare sum and number
if(sum == number)
return true;
return false;
}
// method to calculate factorial of an integer
public static long factorial(int n) {
long fact = 1;
for(int i=1; i<=n; i++) {
fact *= i;
}
return fact;
}
// main method
public static void main(String[] args) {
// declare variables
int number = 0;
boolean result = false;
//create Scanner class object to take input
Scanner scan = new Scanner(System.in);
// take input from end-user
System.out.print("Enter an integer number::");
number = scan.nextInt();
// check number is Special number or not
result = isSpecial(number);
// display result
if(result)
System.out.println(number +
" is a Special number.");
else
System.out.println(number +
" is not a Special number.");
// close Scanner class object
scan.close();
}
}
La sortie pour les différents cas de test est :-
Entrez un nombre entier ::1
1 est un nombre spécial.
Entrez un nombre entier ::145
145 est un nombre spécial.
Entrez un nombre entier ::200
200 n'est pas un nombre spécial.
Voir également :- Numéro spécial, Numéro magique, Numéro Armstrong, Numéro parfait, Numéro maléfique, Numéro espion, Numéro ensoleillé en Java
Optimisation
Nous pouvons analyser que le dernier chiffre sera toujours de 0 à 9, et à chaque fois nous devons trouver la factorielle de 0 à 9 uniquement. Il est donc préférable de calculer la valeur factorielle de 0 à 9 et de la stocker dans un tableau. Pour les grands nombres, ce sera une solution optimisée pour vérifier que le numéro est un numéro spécial ou non. Conclusion :- avant de vérifier que le nombre est un nombre spécial ou non, calculez la factorielle de 0 à 9 et stockez-la dans un tableau.
Le bloc statique s'exécute avant d'exécuter la méthode main donc, les valeurs factorielles de 0 à 9 doivent être calculées et stockées dans le tableau fact[].
Dans le programme Java ci-dessous, nous avons utilisé cette solution optimisée pour vérifier que le numéro est un numéro spécial ou non.
import java.util.Scanner;
public class SpecialNumber {
// Array to store factorial value
// from 0 to 9
static int fact[] = new int[10];
// static block to calculate factorial
static {
fact[0] = fact[1] = 1;
for(int i=2; i<fact.length; ++i)
fact[i] = fact[i-1] * i;
}
// method to Check Special number
public static boolean isSpecial(int number) {
// declare variables
int sum = 0, lastDigit = 0;
int tempNum = number;
// traverse through all digits of number
while(tempNum != 0) {
lastDigit = tempNum % 10;
sum += fact[lastDigit];
tempNum /= 10;
}
// compare sum and number
return (sum == number);
}
// main method
public static void main(String[] args) {
// declare variables
int number = 0;
boolean result = false;
//create Scanner class object to take input
Scanner scan = new Scanner(System.in);
// take input from end-user
System.out.print("Enter an integer number:: ");
number = scan.nextInt();
// check number is Special number or not
result = isSpecial(number);
// display result
if(result)
System.out.println(number +
" is a Special number.");
else
System.out.println(number +
" is not a Special number.");
// close Scanner class object
scan.close();
}
}
Programme Java pour trouver tous les numéros spéciaux dans une plage
import java.util.Scanner;
public class SpecialNumberInRange {
// Array to store factorial value
// from 0 to 9
static int fact[] = new int[10];
// static block to calculate factorial
static {
fact[0] = fact[1] = 1;
for(int i=2; i<fact.length; ++i)
fact[i] = fact[i-1] * i;
}
// method to Check Special number
public static boolean isSpecial(int number) {
// declare variables
int sum = 0, lastDigit = 0;
int tempNum = number;
// traverse through all digits of number
while(tempNum != 0) {
lastDigit = tempNum % 10;
sum += fact[lastDigit];
tempNum /= 10;
}
// compare sum and number
return (sum == number);
}
// main method
public static void main(String[] args) {
// declare variables
int minRange = 0, maxRange = 0;
//create Scanner class object to take input
Scanner scan = new Scanner(System.in);
System.out.print("Enter minimum value of range:");
minRange = scan.nextInt();
System.out.print("Enter maximum value of range:");
maxRange = scan.nextInt();
// loop
System.out.println("The Special number from "+
minRange + " to "+ maxRange+" are: ");
for(int i=minRange; i<=maxRange; i++) {
// check number
if(isSpecial(i))
System.out.print(i +" ");
}
// close Scanner class object
scan.close();
}
}
Sortie :-
Entrez minimum
valeur de la plage : 1
Entrez maximum
valeur de la plage :1000000
Les nombres spéciaux de 1 à 1000000 sont :1 2 145 40585