不用任何比较判断找出两个数中较大的数

不用任何比较判断找出两个数中较大的数

【题目】

  给定两个32位整数a和b,返回a和b中较大的。

【要求】

  不用任何比较判断。

【解答】

  这里有两种方法进行解决,两种方法原理都一样的,只是第二种是第一种的优化。

  sign函数的功能是返回整数n的符号,正数和0返回1,负数返回0.flip函数的功能是做n的异或运算,n是1返回0,n是0返回1。

方法一:

  我们不能直接比较,那么就用减法来判断,a - b值的符号,符号为正a大,符号为负b大。scA表示c的符号,scB表示c的相反的符号,scA是1返回a,scA是0返回B.但是有局限性,那就是a-b的值可能出现溢出,返回结果不正确。

方法二:

  先比较a与b两个数的符号,符号不同difSab==1,sameSab==0;直接返回符号为正的那个数。

如果a为0或正,那么b为负(sa==1,sb==0),则返回a;

如果a为负,那么b为0或正(sa==0,sb==1),则返回b;

  如果符号相同difSab==0,sameSab==1,这种情况下,a-b的值绝对不会溢出,那么就看c的符号。

如果c=a-b,为正返回a;

如果c=a-b,为负返回b;


代码如下:

public class CompleteTwoNum {

	/**
	 * 异或运算
	 */
	public int flip(int n) {
		return n ^ 1;
	}

	/**
	 * n是正数或0返回1 n是负数返回0
	 */
	public int sign(int n) {
		return flip((n >> 31) & 1);
	}

	public int getMax1(int a, int b) {
		int c = a - b;
		int scA = sign(c);// 返回c的符号,正数和0是1,负数是0
		int scB = flip(scA);// 返回c的符号的相反符号
		return a * scA + b * scB;
	}

	/**
	 * 如果a、b的符号相同(+,+)、(-,-),difSab=0,returnA=sc;如果sc是1,返回a,否则返回b
	 * 如果a、b的符号不同(+,-)、(-,+),disSab=1,returnA=sa;如果sa是1,返回a,否则返回b
	 */
	public int getMax2(int a, int b) {
		int c = a - b;
		int sa = sign(a);// 返回a的符号
		int sb = sign(b);// 返回b的符号
		int sc = sign(c);// 返回c的符号
		int difSab = sa ^ sb;
		int sameSab = flip(difSab);
		int returnA = difSab * sa + sameSab * sc;
		int returnB = flip(returnA);
		return a * returnA + b * returnB;

	}

	public static void main(String[] args) {

		CompleteTwoNum twoNum = new CompleteTwoNum();
		Scanner s = new Scanner(System.in);
		int a = s.nextInt();
		int b = s.nextInt();

		System.out.println("方法一:   a=" + a + " , b=" + b + "  大数是:"
				+ twoNum.getMax1(a, b));

		System.out.println("方法二:   a=" + a + " , b=" + b + "  大数是:"
				+ twoNum.getMax2(a, b));
		
//		System.out.println(Integer.MAX_VALUE);// 最大整数2147483647
//		System.out.println(Integer.MIN_VALUE);// -2147483648是32机器中所能表示的最小int。

	}
}
运行结果如下:

123 456
方法一:   a=123 , b=456  大数是:456
方法二:   a=123 , b=456  大数是:456

方法一结果溢出的结果如下:

-2147483648 8
方法一:   a=-2147483648 , b=8  大数是:-2147483648
方法二:   a=-2147483648 , b=8  大数是:8










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个函数的实现很简单,可以使用比较运算符(如">")来判断个数的大小关系,然后返回较大的数。例如: ```python def max_num(num1, num2): if num1 > num2: return num1 else: return num2 ``` 也可以使用Python自带的max()函数,例如: ```python def max_num(num1, num2): return max(num1, num2) ``` 这样就实现了个数的最大值的功能了。 ### 回答2: 实现寻个数最大值的函数可以很简单,可以先判断个数是否大于另一个数,如果是,则返回该数,否则返回另一个数。具体实现如下: ```python def find_max(a, b): if a > b: return a else: return b ``` 在这个函数,我们使用了 if-else 语句来进行条件判断,当 a 大于 b 时就返回 a,反之返回 b。这是一个非常基础的例子,这里函数的功能十分简单,因此代码也十分简单。 使用示例: ```python result = find_max(2, 5) print(result) # 输 5 result = find_max(10, -3) print(result) # 输 10 ``` 在这里,我们先调用了 find_max 函数来获取两个数的最大值,然后再输结果。 总结一下,寻个数最大值这个问题非常简单,只需要一行代码即可解决。然而,这也是编程的魅力所在,即通过解决一个个小而简单的问题,不断地累积经验,不断地向着更高的目标前进。 ### 回答3: 这个问题看似非常简单,但在编程是非常常见的问题,并且在日常操作也非常常见。到两个数的最大值可以通过比较运算符来实现。我们可以编写一个简单的函数来实现这个问题。 假设输入的两个数字为a和b,我们可以使用if语句来比较这两个数字的大小。如果a大于b,我们就返回a;如果a小于b,我们就返回b。如果a等于b,那我们就可以返回任意一个数字,因为它们都是最大值。 下面是一个Python函数的示例,用来到两个数的最大值: def find_max(a, b): if a > b: return a else: return b 这个函数非常简单,只需要两个参数a和b,然后返回最大值。我们可以在Python调用这个函数,如下所示: print(find_max(5, 10)) # 输10 这个函数在Python非常常见,它的语法也非常简单,并且可以轻松地适用于其他编程语言。无论你使用哪个编程语言,只需要按照类似的逻辑来编写函数即可。 总体来说,这个问题的解决方法是非常简单的,并且可以应用到各种类型的应用程序。在编写程序时,到最大值是一个非常常见的操作,因此我们需要学会这个操作并熟练掌握它。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值