剑走偏锋——一道比较大小题的技巧解法
2009-07-31 08:52 Logic0 阅读(202) 评论(0) 编辑 收藏 举报刚在CSDN上看了一道面试题,思路不够开阔,没想出方法,后总结大家方法如下。
题目描述:
给定两个整型数a,b,不许用if,switch,? : ,找出最大的一个。
解法1:
利用C语言的逻辑真假值
#include "stdio.h"
int main()
{
int a=3,b=4;
printf("max is %d\n",(a>=b)*a+(a>b)*b);
return 0;
}
解法2:
利用循环条件(不违反规则,有点娱乐性质)
#include "stdio.h"
int main()
{
int a=3,b=5;
while(a>=b)
{ printf("max is %d\n",a);return 0;}
printf("max is %d\n",b);return 0;
}
for循环也一样
解法3:
利用数学知识
int main()
{
int a=3,b=5;
printf("max is %d\n",(a+b+abs(a-b))/2);
return 0;
}
解法4:
利用整数的符号位
int main()
{
int n[2] = {3,5};
printf("max is %d\n",n[((n[0]-n[1])>>(sizeof(int)*8-1))&1]); //感谢jineslong指出此处问题
}
解法5:
利用C语言判断逻辑的顺序
int main()
{
int a=3,b=5;
return (a<b&&printf("max is %d\n",b))||(a>=b&&printf("max is %d\n",a));
}
呵呵,充分证明了问题的解法不止一种。
题目描述:
给定两个整型数a,b,不许用if,switch,? : ,找出最大的一个。
解法1:
利用C语言的逻辑真假值
#include "stdio.h"
int main()
{
int a=3,b=4;
printf("max is %d\n",(a>=b)*a+(a>b)*b);
return 0;
}
解法2:
利用循环条件(不违反规则,有点娱乐性质)
#include "stdio.h"
int main()
{
int a=3,b=5;
while(a>=b)
{ printf("max is %d\n",a);return 0;}
printf("max is %d\n",b);return 0;
}
for循环也一样
解法3:
利用数学知识
int main()
{
int a=3,b=5;
printf("max is %d\n",(a+b+abs(a-b))/2);
return 0;
}
解法4:
利用整数的符号位
int main()
{
int n[2] = {3,5};
printf("max is %d\n",n[((n[0]-n[1])>>(sizeof(int)*8-1))&1]); //感谢jineslong指出此处问题
}
解法5:
利用C语言判断逻辑的顺序
int main()
{
int a=3,b=5;
return (a<b&&printf("max is %d\n",b))||(a>=b&&printf("max is %d\n",a));
}
呵呵,充分证明了问题的解法不止一种。