Есть ли алгоритм, чтобы определить, подходит ли a * b в возможные значения целого числа? (без приведения к более широкому типу)

Привет всем, мне было интересно, есть ли способ реализовать этот метод без преобразования к более широкому типу данных (например, long, double и т. д.)?

CanTimes(int a, int b){
    returns true if a * b is within the range of -2^31 to 2^31-1, else false;
}

Например, мы могли бы реализовать один для метода CanAdd (без приведений) как таковой:

    public static boolean CanPlus(int a, int b) {
        if (b >= 0) {
            return a <= Integer.MAX_VALUE - b
        } else {
            return a >= Integer.MIN_VALUE - b
        }
    }

Язык реализации - Java, хотя, конечно, это скорее язык - агностическая проблема.

Я подумал, есть ли какая-то логика, которую мы можем использовать, чтобы решить, подходит ли a * b диапазону целого числа, не приводя его к более широкому типу данных?

Решение! по комментарию Стрелка:

public static boolean CanTimes(int a, int b) {
    if (a == 0 || b == 0) {
        return true;
    }
    if (a > 0) {
        if (b > 0) {
            return a <= Integer.MAX_VALUE / b;
        } else {
            return a <= Integer.MIN_VALUE / b;
        }
    } else {
        if (b > 0) {
            return b <= Integer.MIN_VALUE / a;
        } else {
            return a <= -Integer.MAX_VALUE / b;
        }
    }
}
9
задан Pacerier 5 December 2011 в 06:50
поделиться