这只是为了好玩。
你能给我一个方法来确定两个数字的更大价值吗?您可以使用除大于或小于运算符之外的其他运算符。
使用您喜欢的任何工具(编程语言,铅笔纸等)。 另外一件事你不能做到以下几点:
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;
}
答案 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
,都会更大。
所以,如果你从左到右,并且:
0
:转到下一个位置,1
:转到下一个位置,1
,第二个有0
:第一个更大,1
,第一个有0
:第二个更大,如果您确定匹配的是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()
的一个负面参数抛出异常,以获得一个很好的尝试捕获解决方案:)。