gpt4 book ai didi

java - 是否有一种算法可以确定 a * b 是否适合整数的可能值? (不转换为更广泛的类型)

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:25:17 25 4
gpt4 key购买 nike

大家好,我想知道是否有一种方法可以在不转换为更广泛的数据类型(例如 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 是否适合整数范围,而无需将其转换为更广泛的数据类型?

解决方案!基于 Strelok 的评论:

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;
}
}
}

最佳答案

根据我的评论,这是经过改编的版本,其中包含一些单元测试:

public static int mulAndCheck( int a, int b )
{
int ret;
String msg = "overflow: multiply";
if ( a > b )
{
// use symmetry to reduce boundry cases
ret = mulAndCheck( b, a );
}
else
{
if ( a < 0 )
{
if ( b < 0 )
{
// check for positive overflow with negative a, negative b
if ( a >= Integer.MAX_VALUE / b )
{
ret = a * b;
}
else
{
throw new ArithmeticException( msg );
}
}
else if ( b > 0 )
{
// check for negative overflow with negative a, positive b
if ( Integer.MIN_VALUE / b <= a )
{
ret = a * b;
}
else
{
throw new ArithmeticException( msg );

}
}
else
{
// assert b == 0
ret = 0;
}
}
else if ( a > 0 )
{
// assert a > 0
// assert b > 0

// check for positive overflow with positive a, positive b
if ( a <= Integer.MAX_VALUE / b )
{
ret = a * b;
}
else
{
throw new ArithmeticException( msg );
}
}
else
{
// assert a == 0
ret = 0;
}
}
return ret;
}

@Test( expected = ArithmeticException.class )
public void testOverflow()
{
mulAndCheck( Integer.MAX_VALUE, Integer.MAX_VALUE );
}

@Test( expected = ArithmeticException.class )
public void testOverflow1()
{
mulAndCheck( Integer.MIN_VALUE, Integer.MAX_VALUE );
}

@Test
public void testTimesMinus1()
{
Assert.assertEquals( Integer.MIN_VALUE + 1, mulAndCheck( Integer.MAX_VALUE, -1 ) );
Assert.assertEquals( Integer.MAX_VALUE, mulAndCheck( Integer.MIN_VALUE + 1, -1 ) );
}

关于java - 是否有一种算法可以确定 a * b 是否适合整数的可能值? (不转换为更广泛的类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8381528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com