Moderate 不用比较符返回较大的数 @CareerCup

原创 2013年12月02日 07:57:03

通过判断a-b的最高位来知道哪一个数比较大

但是要注意overflow的情况

if a and b have different signs:
	//  if a > 0, then b <  <d,  and  k = l.
	// if a < 0, then b > 0, and k = 0.
	// so either way, k = sign(a)
	let k = sign(a)
else
	let  k  = sign(a  -  b)  //  overflow  is  impossible

但因为不能用if else所以用乘法来代替: 
int k = use_sign_of_a * sa + use_sign_of_c * sc;


package Moderate;


/**
 * Write a method which finds the maximum of two numbers. You should not use if-else or any other comparison operator.

EXAMPLE

Input: 5, 10

Output: 10

译文:

写一个函数返回两个数中的较大者,你不能使用if-else及任何比较操作符。 
 *
 */
public class S17_4 {

	/* Flips a 1 to a 0 and a 0 to a 1 */
    public static int flip(int bit) {
            return 1 ^ bit;
    }
    
    /* Returns 1 if a is positive, and 0 if a is negative */
    public static int sign(int a) {
            return flip((a >> 31) & 0x1);
    }
    
    public static int getMaxNaive(int a, int b) {
            int k = sign(a - b);
            int q = flip(k);
            return a * k + b * q;
    }
    
    public static int getMax(int a, int b) {
            int c = a - b;
            
            int sa = sign(a); 		// if a >= 0, then 1 else 0
            int sb = sign(b); 		// if b >= 0, then 1 else 0
            int sc = sign(c);		// depends on whether or not a - b overflows
            
            /* We want to define a value k which is 1 if a > b and 0 if a < b. 
             * (if a = b, it doesn't matter what value k is) */
            
            int use_sign_of_a = sa ^ sb; 		// If a and b have different signs, then k = sign(a)
            int use_sign_of_c = flip(sa ^ sb); 	// If a and b have the same sign, then k = sign(a - b)
            
            /* We can't use a comparison operator, but we can multiply values by 1 or 0 */
            int k = use_sign_of_a * sa + use_sign_of_c * sc;
            int q = flip(k); // opposite of k
            
            return a * k + b * q;
    }
    
    public static void main(String[] args) {
            int a = 26;
            int b = -15;
            
            System.out.println("max_naive(" + a + ", " + b + ") = " + getMaxNaive(a, b));
            System.out.println("max(" + a + ", " + b + ") = " + getMax(a, b));                
            
            a = -15;
            b = 2147483647;
            
            System.out.println("max_naive(" + a + ", " + b + ") = " + getMaxNaive(a, b));
            System.out.println("max(" + a + ", " + b + ") = " + getMax(a, b));
    }
}


相关文章推荐

不用if-else和比较运算符,得出两个数中较大的那个数

不用if-else和比较运算符,得出两个数中较大的那个数。 EXAMPLE Input: 5, 10 Output: 10 代码: int getMax(int a, int b)...

CareerCup 17 中等难题 Q17.4 不用比较找出两数较大值

题目: 编写一个方法,找出两个数字中最大的那一个。不得使用

Moderate 找最小排序区间 @CareerCup

例子:数组 1, 2, 4, 7, 10, 11, 7, 12, 6, 7, 16, 18, 19  只要对下标3到9之间的元素排序,就能使整个数组有序 思路是: // Left: 1, 2, 4...

比较两个数 显示较大的那个数

  • 2013年03月13日 16:36
  • 6KB
  • 下载

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

不用任何比较判断找出两个数中较大的数 【题目】   给定两个32位整数a和b,返回a和b中较大的。 【要求】   不用任何比较判断。 【解答】   这里有两种方法进行解决,两种方法原理都一...

求较大数的阶乘

  • 2008年07月31日 04:26
  • 1KB
  • 下载

某公司的一道面试题:最新版本号;输入两个表示版本号的字符串,返回版本较大的一个

请实现一个函数:最新版本号;输入两个表示版本号的字符串,返回版本较大的一个;版本字符串分为3断:主版本号,次版本号和编译版本号,之间用”.”分隔,前面的号更重要;比如 ”13.21” > ”5.6...

Zball in Tina Town(数论规律题+特判+较大数判是否为素数的正确姿势)

Link:http://acm.hdu.edu.cn/showproblem.php?pid=5391 Zball in Tina Town Time Limit: 3000/1500 MS (J...

一道腾讯的笔试题,不使用任何判断语句求出两个数中的较大者(即 if、if...else...、>、<、==、while等语句)

一道腾讯的笔试题,不使用任何判断语句求出两个数中的较大者(即 if、if...else...、>、 /** * @file 一道腾讯的笔试题,不使用任何判断语句求出两个数中的较大者(即 if、if...

从控制台输入三个数,输出较大的那个数(Python)

以下是自己写的代码,逻辑说不上清晰,但是也能得出最大的值print("请输入三个数:") num1 = int(input()) num2 = int(input()) num3 = int(inpu...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Moderate 不用比较符返回较大的数 @CareerCup
举报原因:
原因补充:

(最多只允许输入30个字)