Большая ценность без больше или меньше чем операторы - PullRequest
0 голосов
/ 17 мая 2011

это просто для удовольствия.

Можете ли вы дать мне способ определить большее значение двух чисел?Вы можете использовать другие операторы, кроме операторов больше или меньше.

Используйте любой инструмент, который вам нравится (язык программирования, карандашная бумага и т. Д.).И еще одна вещь, которую вы не можете сделать следующее:

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 ]

3 голосов
/ 17 мая 2011

Ну, если вы предполагаете, что арифметика с двумя дополнениями:

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).

2 голосов
/ 18 мая 2011

Хорошо, я бы преобразовал их в двоичный код и прошел бы от левого байта. Какой бы из первых не имел 1, когда другой не имеет (значит: имеет 0), это больше.

Итак, если вы идете слева направо и:

  1. оба имеют 0 в текущей позиции: перейти к следующей позиции,
  2. оба имеют 1 в текущей позиции: перейти к следующей позиции,
  3. первый имеет 1 в текущей позиции, а второй имеет 0: первый больше,
  4. второй имеет 1 в текущей позиции, а первый имеет 0: второй больше,

Если вы определите, что 3. или 4. совпадают, у вас есть результат. Если 1. или 2. совпадают, повторите то же самое для следующей позиции. Если вы прошли все байты и не определили, что один из них больше, то оба равны.

2 голосов
/ 17 мая 2011
#include <algorithm>

cout << std::max(num1, num2) << " is bigger" << endl;
0 голосов
/ 17 мая 2011

Логарифм отрицательного значения не определен; разные языки / рамки обрабатывают это по-разному. Это решение для 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() для хорошего решения try-catch в этом забавном конкурсе:).

0 голосов
/ 17 мая 2011
    #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;
0 голосов
/ 17 мая 2011

Решение 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
0 голосов
/ 17 мая 2011

Предупреждение: непроверенный код.

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

Я не слишком много думал об этом, но, возможно, есть комбинации, которые потерпят неудачу из-за переполнения.

0 голосов
/ 17 мая 2011

Это работает для натуральных чисел:

#! /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
...