LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1617|回复: 19

今天去笔试 忘记了 2圆位置关系还有内含和内切 .做错了5555555555

[复制链接]
发表于 2007-3-25 19:33:37 | 显示全部楼层 |阅读模式
判断2圆 相交..  我只判断了是否 相离  而且我把外切也当成相交的特殊情况 郁闷 ....初中的数学忘记了 ...........

还有题不会做   a=b/13 怎么只用c语言的位操作  表示
发表于 2007-3-26 02:46:46 | 显示全部楼层
Post by biosxjj

还有题不会做   a=b/13 怎么只用c语言的位操作  表示
这好像是一道很经典的面试题。
  1. b/13 = b/16 + [(b/16)x3]/13
  2.      = b/16 + B/13      /* B = (b/16)x3 */            
  3. int div13 (int var)
  4. {
  5.     int tmp1, tmp2, ret = 0;
  6.     for ( ; var >= 13; var = tmp1+tmp1+tmp1+tmp2)
  7.     {
  8.          tmp1 = var >> 4;                /* var / 16 */
  9.          tmp2 = var - (tmp1 << 4);  /* var % 16 */
  10.          if (var < 16)
  11.               return ret += 1;
  12.          ret += tmp1;
  13.     }
  14.     return ret;
  15. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-3-26 10:09:33 | 显示全部楼层
感谢 biinn 兄提供这个算法. 虽然能理解

  1. b/13 = b/16 + [(b/16)x3]/13
  2.      = b/16 + B/13      /* B = (b/16)x3 */
复制代码

但还是不太理解具体的算法实现, biinn 兄能为在下这类数学不好的兄弟们补习一下么, 呵呵

P.S. /* var % 16 */ 不妨用
  1. tmp2 = var & 0x0F;
复制代码

来实现, 应该会比减法快
回复 支持 反对

使用道具 举报

发表于 2007-3-26 10:33:44 | 显示全部楼层
Post by DoDo
P.S. /* var % 16 */ 不妨用
tmp2 = var & 0x0F;
来实现, 应该会比减法快
谢谢指点,这个是最快的!谢谢
Post by DoDo

b/13 = b/16 + [(b/16)x3]/13
     = b/16 + B/13      /* B = (b/16)x3 */
但还是不太理解具体的算法实现
我试试看能不能说清楚:
离13最近的2的幂(这么说对吗?)是16,先把b分成16份。
b/13 = 一份 + 剩下的三份再除以13。
问题就变成了三份 b/16 除以13的问题了,循环计算直到这三份小于13.

注意:剩余部分不仅是3x(b/16),还要加上b%16, 就是上面那个tmp2 = var & 0x0F,呵呵。
回复 支持 反对

使用道具 举报

发表于 2007-3-26 10:34:55 | 显示全部楼层
哦, 有点明白了, 试着把 biinn 兄的算法写成了这个递归算法, 理解起来就容易多了

  1. int div13(int x)
  2. {
  3.         if (x < 13) return 0;
  4.         if (!(x >> 4)) return 1;
  5.         int t = x & 0x0F;
  6.         x >>= 4;
  7.         return x + div13((x << 1) + x + t);
  8. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-3-26 10:37:13 | 显示全部楼层
Post by biinn
谢谢指点,这个是最快的!谢谢


我试试看能不能说清楚:
离13最近的2的幂(这么说对吗?)是16,先把b分成16份。
b/13 = 一份 + 剩下的三份再除以13。
问题就变成了三份 b/16 除以13的问题了,循环计算直到这三份小于13.

注意:剩余部分不仅是3x(b/16),还要加上b%16, 就是上面那个tmp2 = var & 0x0F,呵呵。

没想到这么快就有回复, 嗯, 自己跟着程序跑了几遍, 又推导了一会, 终于明白了, 感谢 biinn 兄
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-26 11:59:04 | 显示全部楼层
受用了 我理解错了 以后只能用  位操作 原来还可以用+-
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-26 12:58:19 | 显示全部楼层
楼上的都是牛人 ...不过  其实就是递归 b/13=b/16+B/13;
B=b/16*3
但是 为什么B要加上余数 啊  而余数不*3啊~~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-26 13:04:27 | 显示全部楼层
不懂阿 ...不懂   比如 24/16=1.5  
1.5*3=4.5  int 为4
但是 24/16=1....8
1*3+8=11
...取整的定律是怎么的阿
回复 支持 反对

使用道具 举报

发表于 2007-3-26 13:15:33 | 显示全部楼层
这里的问题在于 / 代表的是整除.

我们按照 biinn 兄的解释方法来思考这个问题

首先把 b 分成 16 份, 设每一份为 d, 而且在不整除的情况下, 还有一个余数 m

把这 16 个 d 和一个 m 分成两堆
(13d)  +  (3d + m)
对这两堆再分别进行除 13 的操作,

那么第一堆可以整除, 结果为 d, 也就是结果表达式中的 (b/16) 部分;

第二堆如果 (3d+m) 已经小于 13, 那么按照 / 的规则, 它 / 13 的结果为 0, 计算结束, 否则递归操作. 这便是 (b/16*3)/13 部分
回复 支持 反对

使用道具 举报

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

本版积分规则

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