我想比较两个正整数,并在它们之间添加一个比较符号.我可以不使用任何logical,relational或bitwise operators并没有if那么else或while循环或三元运算符.
我找到了max和min这两个数.
如何保留订单并仍插入比较符号?有任何想法吗?
例如:
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)
您可以使用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)
这种方法不需要min和max发现.
(_Bool)exp如果exp为非零,则为1 ;如果exp等于0,则为0.a和b是正整数,a / b将为0时a < b和1时a >= b.有关详细信息,请参阅下面的真值表Run Code Online (Sandbox Code Playgroud)(_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
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>.
#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)