没有大于或小于运营商的更大价值

时间:2011-05-17 13:53:23

标签: algorithm max

这只是为了好玩。

你能给我一个方法来确定两个数字的更大价值吗?您可以使用除大于或小于运算符之外的其他运算符。

使用您喜欢的任何工具(编程语言,铅笔纸等)。 另外一件事你不能做到以下几点:

int main()
{
    int num1, num2;
    cin >> num1 >> num2;

    if( (num1-num2) + abs(num1-num2) )
        cout << num1 << " is bigger" << endl;
    else 
        cout << num2 << " is bigger" << endl;
    return 0;
}

8 个答案:

答案 0 :(得分:3)

好吧,如果你假设两个补码算术:

int highBit = ~INT_MAX;
int rslt = num1 - num2;

if (rslt & highBit)
    // num2 > num1
else if (rslt)
    // num1 > num2
else
    // num1 == num2

只有当两个数字都是正数时,这才有效。例如,如果num1为正数且num2为负数,则num1-num2可能会溢出,导致结果为否定,这会错误地报告num2 > num1。如果两个数字都是负数,则会报告相反的情况(即-12将报告大于-1)。

答案 1 :(得分:2)

#include <algorithm>

cout << std::max(num1, num2) << " is bigger" << endl;

答案 2 :(得分:2)

好的,我会将它们转换为二进制代码并从左边逐字节走。当另一个没有({表示:1)时,无论哪个先0,都会更大。

所以,如果你从左到右,并且:

  1. 在当前位置都有0:转到下一个位置,
  2. 在当前位置都有1:转到下一个位置,
  3. 第一个在当前位置有1,第二个有0:第一个更大,
  4. 第二个在当前位置有1,第一个有0:第二个更大,
  5. 如果您确定匹配的是3.或4.您有结果。如果匹配1.或2.对下一个位置重复相同的操作。如果你已经遍历了所有字节并且没有确定其中一个更大,那么两者都是相同的。

答案 3 :(得分:0)

这适用于正整数:

#! /usr/bin/python
import math

def bigger (a, b):
    length = int (math.log (a, 2) + math.log (b, 2) + 1)
    a = toFixedBitString (a, length)
    b = toFixedBitString (b, length)
    print a, b
    while a:
        if a [0] == '1' and b [0] == '0':
            print "First number is bigger."
            return
        if a [0] == '0' and b [0] == '1':
            print "Second number is bigger."
            return
        a = a [1:]
        b = b [1:]
    print "Numbes are equal."

def toFixedBitString (a, length):
    retVal = ''
    for x in range (length): retVal = ['0', '1'] [a >> x & 1] + retVal
    return retVal

答案 4 :(得分:0)

警告:未经测试的代码。

num2 ~= num2;
++num2;

num1 += num2;

rotate_left(num1, 1);

if (num1 == 0)
    std::cout << "num1 == num2";
else if (num1 & 1) 
    std::cout << "num1 < num2";
else
    std::cout << "num1 > num2";

我没有考虑过很多,但可能会因为溢出而失败。

答案 5 :(得分:0)

SSE 4.1解决方案

#include <smmintrin.h>
#include <iostream>

using namespace std;

int main()
{
    int num1, num2, test;
    __m128i v1, v2, vcmp;

    cin >> num1 >> num2;
    v1 = _mm_set1_epi32(num1);
    v2 = _mm_set1_epi32(num2);
    vcmp = _mm_cmpgt_epi32(v1, v2);
    test = _mm_testz_si128(vcmp, vcmp);
    if (test == 0)
    {
        cout << "num1 is bigger" << endl;
    }
    else
    {
        cout << "num2 is bigger" << endl;
    }
    return 0;
}

$ g++ -Wall -msse4.1 cmpgt.cpp -o cmpgt
$ ./cmpgt
-10 10
num2 is bigger
$ ./cmpgt
10 -10
num1 is bigger

答案 6 :(得分:0)

    #include <limits>

    int a = -1;
    int b = -11;

    // true for positive difference
    bool dpos = ~(unsigned int)(a - b) >> numeric_limits<int>::digits; // 31 for 32-bit

    cout << "Problem : a = " << a << " and b = " << b << endl;
    if (a == b) 
         cout << " a == b " << endl;
    else if (dpos) 
         cout << " a > b " << endl;
    else 
         cout << " a < b " << endl;

答案 7 :(得分:0)

负值的对数未定义;不同的语言/框架以不同的方式处理它。此解决方案适用于C#:

using System;
public class Test
{
    public static bool gt( double a, double b ) {
        return Double.IsNaN(Math.Log(b - a));
    }
    public static void report_gt( double a, double b) {
        if( gt(a,b) )
            Console.WriteLine("{0} is greater than {1}", a, b);
        else
            Console.WriteLine("{0} is less than or equal to {1}", a, b);
    }
    public static void Main()
    {
        Test.report_gt(-1, 0);
        Test.report_gt(1, 0);
        Test.report_gt(1, 2);
        Test.report_gt(-1, -2);
    }
}

输出:

-1 is less than or equal to 0
1 is greater than 0
1 is less than or equal to 2
-1 is greater than -2

C的类似解决方案可以使用浮点异常。不幸的是,在这个有趣的比赛中,C ++没有为log2()的一个负面参数抛出异常,以获得一个很好的尝试捕获解决方案:)。