免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: billzhou
打印 上一主题 下一主题

大家是怎么实现的 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-10-30 22:53 |只看该作者
模运算,模2余0 且除以2以后的结果也符合该要求。1 和 2 单独处理。不考虑负数幂

  1. #include <stdio.h>

  2. int is2_n( int n ) {
  3.     if( n < 1 )
  4.         return( 0 );

  5.     if( n == 2 || n == 1 )
  6.         return( 1 );

  7.     return( is2_n( n / 2 ) && n && ( ! ( n % 2 ) ) );
  8. }

  9. int main( void ) {
  10.     int i = 0;
  11.     while( i < 10000 ) {
  12.         if( is2_n( i ) )
  13.             printf( "%d\n", i );
  14.         i ++;
  15.     }

  16.     return( 0 );
  17. }

复制代码

论坛徽章:
0
12 [报告]
发表于 2007-10-30 23:02 |只看该作者
原帖由 xB1ue 于 2007-10-30 22:53 发表
模运算,模2余0 且除以2以后的结果也符合该要求。1 和 2 单独处理。不考虑负数幂

#include

int is2_n( int n ) {
    if( n < 1 )
        return( 0 );

    if( n == 2 || n == 1 )
        retu ...

一句程序?

论坛徽章:
0
13 [报告]
发表于 2007-10-30 23:30 |只看该作者
原帖由 billzhou 于 2007-10-30 22:08 发表
递归是可以滴:wink:


lz 说了递归也可以的

论坛徽章:
0
14 [报告]
发表于 2007-10-30 23:34 |只看该作者
原帖由 sanbiangongzi 于 2007-10-30 22:13 发表



晕了,更正,0不是2的幂哈

所以应该是 (x && (x&(x-1)))

x==0时,这个表达式的结果就是0了,但0不是2的幂。

论坛徽章:
0
15 [报告]
发表于 2007-10-30 23:38 |只看该作者
原帖由 cugb_cat 于 2007-10-30 23:02 发表

一句程序?


如果非要用“一句话”递归
只有这么难看了:

  1. int is2_n( int n ) { return( ( n < 1 ) ? 0 : ( ( n == 2 || n == 1 ) ? 1 : ( is2_n( n / 2 ) && n && ( ! ( n % 2 ) ) ) ) ); }

复制代码

论坛徽章:
0
16 [报告]
发表于 2007-10-30 23:42 |只看该作者
原帖由 zwylinux 于 2007-10-30 23:34 发表

x==0时,这个表达式的结果就是0了,但0不是2的幂。


他说的是判断条件,就是 if( ... )

但是还是有问题,1是2的0次幂

论坛徽章:
0
17 [报告]
发表于 2007-10-31 00:22 |只看该作者
原帖由 sanbiangongzi 于 2007-10-30 22:08 发表
2的幂就是说:为0或者只有一位是1
x&(x-1)就应该等于0

如果有两个或者两个以上的1那么x&(x-1)肯定不等于0

所以判断x&(x-1)即可


好像内核里有地方就是用这种方法哦

论坛徽章:
0
18 [报告]
发表于 2007-10-31 21:33 |只看该作者
差点给忘记了,以前写过这个算法:

http://www.cppblog.com/converse/ ... /10/9664.aspx#35604

论坛徽章:
0
19 [报告]
发表于 2007-10-31 21:40 |只看该作者
原帖由 sanbiangongzi 于 2007-10-30 22:13 发表



晕了,更正,0不是2的幂哈

所以应该是 (x && (x&(x-1)))



--------
再修改
  (x && !(x&(x-1)))

论坛徽章:
0
20 [报告]
发表于 2007-10-31 22:18 |只看该作者
原帖由 sanbiangongzi 于 2007-10-31 21:40 发表



--------
再修改
  (x && !(x&(x-1)))

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP