Java >> Tutoriel Java >  >> Java

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


Balise Java