LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: soloforce

一道面试题:编写一个函数比较两个整数大小,但不能使用任何比较操作符

[复制链接]
发表于 2006-9-9 14:45:39 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(int argc,char *argv[])
  4. {
  5.         int num1,num2;
  6.         int i = 0;
  7.         int tok =0;
  8.         char result[3][32];
  9.         if(argc != 3)
  10.         {
  11.                 printf("Usage: cmp_int num1 num2\n");
  12.                 exit(1);
  13.         }
  14.         num1 = atoi(argv[1]);
  15.         num2 = atoi(argv[2]);
  16.         sprintf(result[0],"%d = %d",num1,num2);
  17.         sprintf(result[1],"%d > %d",num1,num2);
  18.         sprintf(result[2],"%d < %d",num1,num2);
  19.         printf("The lagest int number is %d\n",~(1 << (sizeof(int) * 8 - 1)));
  20.         printf("The lest int number is %d\n",1 << (sizeof(int) * 8 - 1));
  21.         tok = (num1 >> 31) ^ (num2 >> 31); // = 0 if they have the same tok, else =-1;
  22.         i = (((num1 >> 31) & tok) * 2) + ((num2 >> 31) & tok) + ((((num1 - num2) & (~tok)) >> (sizeof(int) * 8 - 1)) * 2) + (((num2 - num1) & (~tok)) >> (sizeof(int) * 8 - 1));
  23.         printf("Result: %s\n",result[-i]);
  24.         return 0;
  25. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-9-9 14:53:52 | 显示全部楼层
Post by Arthur.Echo
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main(int argc,char *argv[])
  4. {
  5.         int num1,num2;
  6.         int i = 0;
  7.         int tok =0;

  8.         char result[3][32];

  9.         if(argc != 3)
  10.         {
  11.                 printf("Usage: cmp_int num1 num2\n");
  12.                 exit(1);
  13.         }


  14.         num1 = atoi(argv[1]);
  15.         num2 = atoi(argv[2]);

  16.         sprintf(result[0],"%d = %d",num1,num2);
  17.         sprintf(result[1],"%d > %d",num1,num2);
  18.         sprintf(result[2],"%d < %d",num1,num2);

  19.         printf("The lagest int number is %d\n",~(1 << (sizeof(int) * 8 - 1)));
  20.         printf("The lest int number is %d\n",1 << (sizeof(int) * 8 - 1));

  21.         tok = (num1 >> 31) ^ (num2 >> 31); // = 0 if they have the same tok, else =-1;

  22.         i = (((num1 >> 31) & tok) * 2) + ((num2 >> 31) & tok) + ((((num1 - num2) & (~tok)) >> (sizeof(int) * 8 - 1)) * 2) + (((num2 - num1) & (~tok)) >> (sizeof(int) * 8 - 1));

  23.         printf("Result: %s\n",result[-i]);

  24.         return 0;
  25. }
复制代码

我自己测了一下,没有发现问题,溢出解决了,没有用到比较操作符和if、switch等
大家找找问题看,谢谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-9 15:28:23 | 显示全部楼层
强啊! 连判断语句都不用了。。。。
回复 支持 反对

使用道具 举报

发表于 2006-9-9 16:12:06 | 显示全部楼层
#include <iostream.h>
int main()
{
        int a, b;
        cin >> a >> b;
        if(a - b)
        {
                if((int)(a/b))
                        cout << "a > b\n";
                else
                        cout << "a < b\n";
        }
        else
        {
                cout << "a=b\n";
        }
        return 0;
}
回复 支持 反对

使用道具 举报

发表于 2006-9-9 18:05:39 | 显示全部楼层
开眼界了.呵呵呵呵
回复 支持 反对

使用道具 举报

发表于 2006-9-9 22:17:44 | 显示全部楼层
Post by Arthur.Echo


  1. tok = (num1 >> 31) ^ (num2 >> 31); // = 0 if they have the same tok, else =-1;
  2. i = (((num1 >> 31) & tok) * 2) + ((num2 >> 31) & tok) + ((((num1 - num2) & (~tok)) >> (sizeof(int) * 8 - 1)) * 2) + (((num2 - num1) & (~tok)) >> (sizeof(int) * 8 - 1));
复制代码


这个最强!
不过看不懂算法,求Arthur兄讲解一下 :-)
回复 支持 反对

使用道具 举报

发表于 2006-9-10 08:45:03 | 显示全部楼层
  1. tok = (num1 >> 31) ^ (num2 >> 31); // = 0 if they have the same tok, else =-1;
复制代码
这一条代码是判断两个数的符号的,如果两个数同号则结果为0x00000000,如果异号结果则为0xffffffff.
  1. i = (((num1 >> 31) & tok) * 2) + ((num2 >> 31) & tok) + ((((num1 - num2) & (~tok)) >> (sizeof(int) * 8 - 1)) * 2) + (((num2 - num1) & (~tok)) >> (sizeof(int) * 8 - 1));
复制代码
这条语句分两部分:
第一部分是:
  1. (((num1 >> 31) & tok) * 2) + ((num2 >> 31) & tok)
复制代码
处理异号的情况,此时tok=0xffffffff,这样后一部分就不起作用了,因为它们都&(~tok).
第二部分是:
  1. ((((num1 - num2) & (~tok)) >> (sizeof(int) * 8 - 1)) * 2) + (((num2 - num1) & (~tok)) >> (sizeof(int) * 8 - 1));
复制代码
处理同号的情况,此时tok=0x00000000,这样前一部分就不起作用了,因为它们都&tok。
这样同号异号分开处理就可以处理异号相减所发生的益处的情况。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-10 09:15:20 | 显示全部楼层
Arthur.Echo 兄的解法当真非常巧妙!鬼斧神工了,呵呵
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表