免费注册 查看新帖 |

Chinaunix

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

[算法] 算法题一道,欢迎讨论 [复制链接]

论坛徽章:
0
71 [报告]
发表于 2008-09-05 01:14 |只看该作者

回复 #70 xiaonanln 的帖子

这个的性能接近我的算法

论坛徽章:
0
72 [报告]
发表于 2008-09-05 15:37 |只看该作者

回复 #1 xiaozhu2007 的帖子

一个正整数!!!
time=0;
while(1)
{
      time++;
      判断n是否为零,如果零
      {      
               n++;
               break;
       }
      如果不是零
             n/=2;
}

时间复杂度O(1),不就完了吗?想不通哪儿来的那么多回帖!!!

论坛徽章:
0
73 [报告]
发表于 2008-09-05 15:39 |只看该作者
原帖由 4tar 于 2008-9-5 01:14 发表
这个的性能接近我的算法

性能比版版的差,慢25%。

论坛徽章:
0
74 [报告]
发表于 2008-09-05 17:56 |只看该作者

回复 #1 xiaozhu2007 的帖子

int i=0;
if(n%2 !=0)
   n--;
for(i=1;;i++)
{
    if((n>>i)<=0)//做移位,并批判断移位的结构是否大与零
       break
}
return i;

[ 本帖最后由 lkq0211 于 2008-9-5 18:01 编辑 ]

论坛徽章:
0
75 [报告]
发表于 2008-09-05 20:02 |只看该作者
看了好半天终于把前面的贴子都看完了,下面说说俺的做法吧。这里只谈一下思想,没有去写具体的程序。

1  定义一个函数
   chTenToTwo(int i)            //功能是把十进制数转变为二进制数
   numOfOne(string s)        //功能是计算二进制数中1的个数

2  
     假设该数为M

     N=chTenToTwo(M)

     while (N>1)
    {
        if  N 是偶数  then
          N=N/2
        else

              // 判断N+1与N-1后哪个包含1的个数多
         A =numOfOne(N + 1)
             B =numOfOne(N - 1)

              if A >= B then
                 N=N-1
              else
                  N=N+1
              end if  
     end if
    }

[ 本帖最后由 gouree 于 2008-9-5 20:03 编辑 ]

论坛徽章:
0
76 [报告]
发表于 2008-09-06 00:09 |只看该作者

回复 #75 gouree 的帖子

不对

论坛徽章:
0
77 [报告]
发表于 2008-09-06 17:28 |只看该作者
原帖由 snick 于 2008-9-1 10:02 发表
直接取模可以么?  只要一次或两次

奇数 X % 2               1 次
偶数  (X + 1) % 2      2 次

哈哈,太强啊,我顶

论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:32:30
78 [报告]
发表于 2008-09-07 09:47 |只看该作者
int calc_count(unsigned long _number)
{
    const int _bit_width = sizeof(_number) * 8;
    if ( 1 - _number < 3 ) {
        if ( _number == 0 ) return 1;
        if ( _number == 1 ) return 0;
        if ( _number == 0 - 1 ) return _bit_width + 1;
    }
    int _pre_fix = 0;
    for ( unsigned long _msk_val = _number & 3; _number > 1; _msk_val = _number & 3 ) {

        if ( _msk_val == 1 ) {
            _number--;
            _pre_fix++;
        }
        else {
            if ( _number == 3 ) return _pre_fix + 2;
            _pre_fix += _number & 1;
            _number += (_number & 1);
            unsigned long long _bit_val = ((~_number) & ( _number - 1)) + 1;

            int _bit_pos;

            if ( _bit_val > 255 ) _bit_pos = _bit_width / 2;

            else _bit_pos = 4;

            for ( int _step_size = _bit_pos / 2; (1 << _bit_pos) != _bit_val ; _step_size /= 2 ) {

                _bit_pos += ( ( 1 << _bit_pos ) > _bit_val)?-_step_size: _step_size;
            }
            _pre_fix += _bit_pos;
            _number >>= _bit_pos;
        }
    }
    return _pre_fix;
}

论坛徽章:
0
79 [报告]
发表于 2008-09-10 13:50 |只看该作者
减来减去干嘛呢,直接除以2,一直除知道结果为0就好了啊~

论坛徽章:
0
80 [报告]
发表于 2008-09-10 13:52 |只看该作者
这样看来的话输入的书表示成2进制数,假如有N位的话就需要N-1次右移操作咯
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP