0
votes

Pourquoi ai-je une sortie incorrecte pour l'entrée -100000000000000?

    public class dataType {

    public static  void  main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        int t=sc.nextInt();

        for(int i=0;i<t;i++)
        {
            try
            {
                long x=sc.nextLong();
                System.out.println(x+" can be fitted in:");
                if(x>=-128 && x<=127)System.out.println("* byte");
                if(x>=-1*(int)(Math.pow(2,15)) && x<=(int)(Math.pow(2,15)-1))System.out.println("* short");
                if(x>=-1*(int)(Math.pow(2,31)) && x<=(int)(Math.pow(2,31)-1))System.out.println("* int");
                if((x>=-1*(int)(Math.pow(2,63))) &&( x<=(int)(Math.pow(2,63)-1)))
                    System.out.println("* long");


            }
            catch(Exception e)
            {
                System.out.println(sc.next()+" can't be fitted anywhere.");
                sc.next();
            }

        }
    }
}

  For the Input number= -100000000000000,
      Expected Output = -100000000000000 can be fitted in:
                         * long 
      Actual Output   =  -100000000000000 can be fitted in:
  
  Problem is that it is not printing the message after the last if
  condition    to check whether the number is in range of long data
  type.

5 commentaires

Au lieu de tous ces calculs, il serait préférable d'utiliser MINVALUE et MAXVALUE disponibles avec chaque classe wrapper pour les types de données primitifs. La plupart des erreurs d'assertion que vous obtenez devraient disparaître.


Exemple, remplacez if (x> = - 128 && x <= 127) System.out.println ("* byte"); avec if (x> = Byte.MINVALUE && x <= Byte.MAXVALUE) System.out.println ("* byte");


@Kavitha, je suis confronté à un problème avec la condition qui vérifie si le nombre est dans la plage de type de données Long et imprime Long ... après avoir vérifié la condition if, il n'imprime pas le * long


Avez-vous essayé de changer cette condition de if ((x> = - 1 * (int) (Math.pow (2,63))) && (x <= (int) (Math.pow (2,63) -1) )) à if (X> = Long.MINVALUE && X <= Long.MAXVALUE)? Quelle est la sortie que vous obtenez après ce changement?


(int)(Math.pow(2,63) est sûr de déborder - cette valeur ne rentre pas du tout dans un int .


3 Réponses :


1
votes

Votre logique peut devenir fastidieuse. Utilisez les méthodes de la classe Wrapper pour pouvoir travailler sans fournir les plages elles-mêmes.

Par exemple:

Scanner sc = new Scanner(System.in);
      int t = sc.nextInt();
      int x = 0;
      for(int i = 0; i <=t;i++) {
          x = sc.nextInt();
          try  {
            if(x >= BYTE.MINVALUE && x <= BYTE.MAXVALUE) System.out.println("Byte");
           //Same format for all required datatypes

          }
          catch(Exception e)  {
              System.out.println(sc.next()+" can't be fitted anywhere.");
              sc.next();
          }
       }

      }

J'espère que cela t'aides!


2 commentaires

La boucle for est pour le nombre de cas de test qui n'ont rien à voir avec la vérification des conditions. Cela ne fera donc aucune différence pour le code, que la boucle soit là ou non.


@PrernaBhadoria, oui c'est correct. Permettez-moi de modifier ma réponse en conséquence. Veuillez l'approuver si cela fonctionne!



1
votes

Je crois que la ligne où vous avez (int)(Math.pow(2,63) entraîne un débordement? Vous devrez stocker cela dans un type de données plus grand tel qu'un long


0 commentaires

0
votes

monsieur en fait il n'y avait pas besoin de (int) Math.pow (2,63) car cela provoquerait un débordement


0 commentaires