G V Sandeep
G V Sandeep

Reputation: 233

Finding the appropriate Java Datatype

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);

    while (input.hasNextLine()) {
        BigInteger number = new BigInteger(input.nextLine());

        int bitLength = number.bitlength();
        if (bitLength <= Bytes.SIZE)
            System.out.println("\u8211 byte");
        if (bitLength <= Short.SIZE)
            System.out.println("\u8211 short");
        if (bitLength <= Int.SIZE)
            System.out.println("\u8211 int");
        if (bitLength <= Long.SIZE)
            System.out.println("\u8211 long");

        if (bitLength > Long.SIZE)
            System.out.println(number + " can't be fitted anywhere.");
    }
} 

Task : to find a suitable data type Sample Input :5

-150
 150000
 1500000000
 213333333333333333333333333333333333
-100000000000000

Sample Output :

-150 can be fitted in:
short
int
long

150000 can be fitted in:
int
long

1500000000 can be fitted in:
int
long
213333333333333333333333333333333333 can't be fitted anywhere.

-100000000000000 can be fitted in:
long

Error 1:

error: cannot find symbol
    int bitLength = number.bitlength();
                      ^

Error 2:

symbol:   method bitlength()
location: variable number of type BigInteger

Error 3:

error: cannot find symbol
    if (bitLength <= Int.SIZE)
                 ^
    symbol:   variable Int
    location: class Solution

Upvotes: 6

Views: 2523

Answers (5)

Vid
Vid

Reputation: 5

import java.util.*;
import java.io.*;

class Solution {
  public static void main(String[] argh) {
    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 >= -(Math.pow(2, 15)) && x <= (Math.pow(2, 15) - 1)) System.out.println("* short");
            if (x >= -(Math.pow(2, 31)) && x <= (Math.pow(2, 31) - 1)) System.out.println("* int");
            if (x >= -(Math.pow(2, 63)) && x <= (Math.pow(2, 63) - 1)) System.out.println("* long");

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

Upvotes: 0

R.Singh
R.Singh

Reputation: 1

  int t = sc.nextInt();
  for (int i = 0; i < t; i++) {
      BigInteger x = sc.nextBigInteger();
      int bitLength = x.bitLength() + 1;
      StringBuilder output= new StringBuilder(x.toString() + " can be fitted in:\n");
      if (bitLength <= Byte.SIZE)
          output.append("* byte\n");
      if (bitLength <= Short.SIZE)
          output.append("* short\n");
      if (bitLength <= Integer.SIZE)
          output.append("* int\n");
      if (bitLength <= Long.SIZE)
          output.append("* long\n");

      if (output.subSequence(output.indexOf(":"),output.length()-1).length() >    1) {
          System.out.print(output);

      } else {
          System.out.println(x + " can't be fitted anywhere.");
      }
  }

Upvotes: 0

Danish
Danish

Reputation: 36

You can simply put the conditions with the range of data types and check whether the input number falls in which data type.

    class FindDataType {
public static void main(String[] argh) {
    Scanner sc = new Scanner(System.in);
    //no. of input values
    int t = sc.nextInt();
    for (int i = 0; i < t; i++) {
        try {
            //Take input as long data type
            long x = sc.nextLong();
            System.out.println(x + " can be fitted in:");
            //Putting conditions to check the data type
            if (x >= -128 && x <= 127) {
                System.out.println("* byte");
                System.out.println("* short");
                System.out.println("* int");
                System.out.println("* long");
            } else if (x >= -32768 && x <= 32767) {
                System.out.println("* short");
                System.out.println("* int");
                System.out.println("* long");
            } else if (x >= -2147483648 && x <= 2147483647) {
                System.out.println("* int");
                System.out.println("* long");
            } else if (x >= -9223372036854775808l
                    && x <= 9223372036854775807l) {
                System.out.println("* long");
            }
        } catch (Exception e) {
            //Printing exception if no data type matches.
            System.out.println(sc.next() + " can't be fitted anywhere.");
        }

    }
    sc.close();
}}

Upvotes: 0

Masudul
Masudul

Reputation: 21971

Read the number line by line. Count bit using BigInteger and divide it by 8 for switch case simplification. Have a look at below code:

    Scanner input = new Scanner(new File("so/input.txt"));
    while (input.hasNextLine()) {
        BigInteger number = new BigInteger(input.nextLine().trim());
        int bitLength = number.bitLength();
        int len = bitLength / 8;
        StringBuilder output = new StringBuilder(number.toString() + " can be fitted in:\n");
        switch (len) {
            case 0:
                output.append(" byte");
            case 1:
                output.append(" short");
            case 2:
            case 3:
                output.append(" int");
            case 4:
            case 5:
            case 6:
            case 7:
                output.append(" long");
                System.out.println(output);
                break;
            default:
                System.out.println(number.toString() + "  can't be fitted anywhere.");
        }
    }

Upvotes: 1

Peter Lawrey
Peter Lawrey

Reputation: 533680

Error :illegal character: \8211 before every If statement

To put this character in you code us \u8211

If statement and how will take input of the number which can't be accommodated in any data type ?

You need to use a datatype which can accommodated and number.

Try this instead.

while (input.hasNextLine()) {
    BigInteger number = new BigInteger(input.nextLine());

    int bitLength = number.bitLength() + 1;
    if (bitLength <= Bytes.SIZE)
         System.out.println(" \u8211 byte");

    if (bitLength <= Short.SIZE)
         System.out.println(" \u8211 short");

    // more checks.

    if (bitLength > Long.SIZE)
        // too big.

Having done the problem, there is plenty more to do to get this to work but using BigInteger.bitLength() is the more elegant solution.

cannot find symbol if (bitLength <= Int.SIZE)

There is no type Int in Java, it is Integer.

Upvotes: 0

Related Questions