比较两个整数并在两个数字之间插入比较符号<,> =

-3 c math

我想比较两个正整数,并在它们之间添加一个比较符号.我可以不使用任何logical,relationalbitwise operators并没有if那么elsewhile循环或三元运算符.

我找到了maxmin这两个数.

如何保留订单并仍插入比较符号?有任何想法吗?

例如:

4 6 由用户输出必须输入 4 < 6

10 2 由用户输出必须输入 10 > 2

2 2 由用户输出必须输入 2 = 2

f1 = x / y;
f2 = y / x;

f1 = (f1 + 2) % (f1 + 1);
f2 = (f2 + 2) % (f2 + 1);

max = f1  * x + f2 * y ;
max = max / (f1 + f2); 
Run Code Online (Sandbox Code Playgroud)

nal*_*zok 5

您可以使用char数组:

#include <stdio.h>

int main(void)
{
    unsigned a, b;
    scanf("%u %u", &a, &b);

    size_t cmp = (_Bool)(a / b) - (_Bool)(b / a);
    char relation = "<=>"[cmp + 1];
    printf("%u %c %u\n", a, relation, b);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这种方法不需要minmax发现.

说明:

  1. (_Bool)exp如果exp为非零,则为1 ;如果exp等于0,则为0.
  2. 由于ab是正整数,a / b将为0时a < b和1时a >= b.有关详细信息,请参阅下面的真值表
        (_Bool)(a / b)    (_Bool)(b / a)     (_Bool)(a / b) - (_Bool)(b / a)

a > b          1                 0                          1

a = b          1                 1                          0

a < b          0                 1                         -1
Run Code Online (Sandbox Code Playgroud)
  1. 结果,cmp评估为-1, 0, 1,像典型的比较函数.因此,cmp + 1将方便地导致0, 1, 2有效的数组索引.

谢谢@janos 的帮助.

编辑:

正如@chux小心指出的那样,

OP声明"我可能不会使用任何合乎逻辑的......运营商".C规范有"......逻辑否定运算符!......".§6.5.3.35.使用!可能不符合OP的目标.

所以我改变!!exp,以(_Bool)exp满足业务方案的需求.

编辑二:

OP评论说:

谢谢.当其中一个输入为0时,这不起作用.

但是,输入数字不是正面的吗?好吧,要处理你可以使用的零size_t cmp = (_Bool)((a + (_Bool)(a - UINT_MAX)) / (b + (_Bool)(b - UINT_MAX))) - (_Bool)((b + (_Bool)(b - UINT_MAX)) / (a + (_Bool)(a - UINT_MAX)));.别忘了#include <limits.h>.

编辑III(最后的编辑,我希望):

#include <stdio.h>
#include <limits.h>

#define ISEQUAL(x, y) (_Bool)((_Bool)((x) - (y)) - 1) // 1 if x == y, 0 if x != y
#define NOTEQUAL(x, y) (_Bool)((x) - (y)) // 0 if x == y, 1 if x != y

int main(void)
{
    unsigned a, b;
    printf("%u\n", UINT_MAX);
    scanf("%u %u", &a, &b);

    _Bool hasZero = NOTEQUAL(ISEQUAL(a, 0) + ISEQUAL(b, 0), 0);
    _Bool hasMax = NOTEQUAL(ISEQUAL(a, UINT_MAX) + ISEQUAL(b, UINT_MAX), 0);
    int hasBoth = ISEQUAL(hasZero + hasMax, 2);
    int cmp = (_Bool)((a + hasZero + hasBoth) / (b + hasZero + hasBoth))\
            - (_Bool)((b + hasZero + hasBoth) / (a + hasZero + hasBoth));
    // "+ hasZero + hasBoth" to avoid div 0: UINT_MAX -> 1, while 0 -> 2.
    hasBoth =  1 - hasBoth * 2; // 1 if hasBoth == 0, or -1 if hasBoth == 1
    char relation = "<=>"[hasBoth * cmp + 1]; // reverse if has both 0 and UINT_MAX
    printf("%u %c %u\n", a, relation, b);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  1. 修复了@chux指出= = UINT_MAX - 1和b == UINT_MAX时的错误.
  2. 使用宏来提高可读性.
  3. 添加了一些评论.