免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 9406 | 回复: 25
打印 上一主题 下一主题

[算法] 不用除法怎么求A/3 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-21 20:57 |只看该作者 |倒序浏览
今天看到一个题目,说的是一个32位整数A,要求不用除法,怎么求A/3?

这让我想到从朋友那里听到的一个问题,写一个函数,实现除法和乘法,但是不能用乘法和除法运算符,乘法还知道怎么实现,

但是除法就百思不得其解,但是今天就出现了这个类似的问题,没弄出来,伤心死了

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
2 [报告]
发表于 2012-10-21 21:05 |只看该作者
论坛上有人发过,就是x*2^32/3 MS

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
3 [报告]
发表于 2012-10-21 21:32 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
4 [报告]
发表于 2012-10-21 21:39 |只看该作者
pmerofc 发表于 2012-10-21 21:32
用减法


赞, 循环减...

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
5 [报告]
发表于 2012-10-21 22:05 |只看该作者
本帖最后由 Ager 于 2012-10-21 22:49 编辑

比较bt的算法:
  1. int DividedBy3(int A) {
  2.         int Q2_3 = 0, Q3_4 = 0, P = 0;
  3.         do {
  4.                 Q3_4 += A >> P++;
  5.                 Q2_3 += A >> P;
  6.         } while (P++,P < 31);
  7.         return (Q3_4 - Q2_3) >> 1;
  8. }
复制代码
以上,仅供参考,呵呵 ——:)

P.S. 这个是为了保险,有点复杂。楼下的那个,更清爽:)



论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
6 [报告]
发表于 2012-10-21 22:48 |只看该作者
本帖最后由 Ager 于 2012-10-22 02:01 编辑

经过优化,还可以有一个超级简单的,更加清爽。同上面那个一样,也是用到了一些数学知识,呵呵……
  1. int DividedBy3(int A) {
  2.         int p = 0;
  3.         for (int i = 2; i <= 32; i += 2)
  4.                 p += A << i;
  5.         return (-p);
  6. }
复制代码
经过32-bit整数(包括负整数)测试,OK的。

以上,仅供参考,呵呵 ——:)

论坛徽章:
0
7 [报告]
发表于 2012-10-21 23:47 |只看该作者
其实这样也行:
  1. #include <cstddef>

  2. template<std::size_t N>
  3. struct div3
  4. {
  5.     static const std::size_t value = 1 + div3<N-3>::value;
  6. };

  7. template<>
  8. struct div3<0>
  9. {
  10.     static const std::size_t value = 0;
  11. };

  12. template<>
  13. struct div3<1>
  14. {
  15.     static const std::size_t value = 0;
  16. };

  17. template<>
  18. struct div3<2>
  19. {
  20.     static const std::size_t value = 0;
  21. };

  22. #include <iostream>

  23. int main()
  24. {
  25.     std::cout << div3<1763>::value << std::endl;
  26.     std::cout << 1763/3 << std::endl;
  27.     return 0;
  28. }
复制代码

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
8 [报告]
发表于 2012-10-21 23:52 |只看该作者
ok. 留个名.

论坛徽章:
0
9 [报告]
发表于 2012-10-22 00:02 |只看该作者
本帖最后由 fallening_cu 于 2012-10-22 00:07 编辑

或者这样
  1. std::int32_t div3( const std::int32_t n )
  2. {
  3.    if ( n < 0 ) return -div3(-n)-1;
  4.    const std::int64_t magic = 1431655766;
  5.    const std::int64_t nagic = magic * n;
  6.    return nagic >> 32;
  7. }
复制代码
P.S:
弱弱地问下,大家做有负整数的除法的时候,都是上往上舍入还是往下舍入?

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
10 [报告]
发表于 2012-10-22 02:03 |只看该作者
本帖最后由 Ager 于 2012-10-22 02:04 编辑
fallening_cu 发表于 2012-10-22 00:02
或者这样
const std::int64_t nagic = magic * n;
P.S:

发仔很忙 发表于 2012-10-21 20:57
写一个函数,实现除法和乘法,但是不能用乘法和除法运算符,乘法还知道怎么实现,……


友情提醒
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP