| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3752 人关注过本帖
标题:[还是代码游戏]对折纸
只看楼主 加入收藏
return_0
Rank: 8Rank: 8
来 自:五维空间
等 级:禁止访问
威 望:3
帖 子:512
专家分:838
注 册:2020-1-28
收藏
得分:5 
快速幂行么.。。

2020-04-13 21:27
return_0
Rank: 8Rank: 8
来 自:五维空间
等 级:禁止访问
威 望:3
帖 子:512
专家分:838
注 册:2020-1-28
收藏
得分:0 
17次,最笨的算法都能做到 0.04788 sec

[此贴子已经被作者于2020-4-13 21:37编辑过]


2020-04-13 21:30
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
以下是引用wmf2014在2020-4-13 21:22:24的发言:

log2编译不成功。

这就有点奇怪了 标准文档ISO/IEC 9899:201x 里面是支持这个函数的

https://zh.
2020-04-13 21:34
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
以下是引用wmf2014在2020-4-13 21:27:00的发言:

当然也可以右移到负数,循环5次,结果是32-5即可。
for(i=88484300;i>0;j++,i*=2);
printf("%d\n",32-j);
还有一个快速去2位底的对数函数,这是网上^v的
int FastLog2(int x)
{
    float fx;
    unsigned long ix, exp;

    fx = (float)x;
    ix = *(unsigned long*)&fx;
    exp = (ix >> 23) & 0xFF;

    return exp - 127;
}

for(i=88484300;i>0;j++,i*=2);
printf("%d\n",32-j);
这个做法是目前所有实现中最优秀的做法了
但是有一个小小的瑕疵 这个做法利用了有符号数溢出 这是一个不可靠的特性
改为无符号类型 循环退出条件改为检查最高位是不是1 会更合适一些

对数函数的是目前所有做法里面最快的
但ix = *(unsigned long*)&fx;这一句其实不能保证正确
float* 转换到 unsigned long* 再做一元*是做法我个人不提倡
备注 我知道这个做法十分著名 但我就是不提倡

https://zh.
2020-04-13 21:39
return_0
Rank: 8Rank: 8
来 自:五维空间
等 级:禁止访问
威 望:3
帖 子:512
专家分:838
注 册:2020-1-28
收藏
得分:0 
cout改成printf变成了 0.03096 sec 省了0.01692 sec

2020-04-13 21:39
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
回复 9楼 fulltimelink
折半是一个十分有价值的想法
但实现起来估计会在边界值碰到很多问题
有不少坑需要解决

https://zh.
2020-04-13 21:40
D2284581470
Rank: 3Rank: 3
来 自:沈阳
等 级:论坛游侠
威 望:2
帖 子:169
专家分:147
注 册:2019-12-8
收藏
得分:5 
请问答案是不是26次???
程序代码:
#include<stdio.h>
int main()
{
    double sum = 0;
    double num=0.1;
    int count = 0;
    while (1)
    {
        sum += num;
        num *= 2;
        count++;
        if (sum > 8844430)
        {
            printf("%d\n", count - 1); break;
        }
    }
    return 0;
}
2020-04-13 21:42
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
回复 12楼 return_0
17次对比目前已知的 折半或者左移88444300
显得略多

https://zh.
2020-04-13 21:44
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
以下是引用D2284581470在2020-4-13 21:42:08的发言:

请问答案是不是26次???#include<stdio.h>
int main()
{
    double sum = 0;
    double num=0.1;
    int count = 0;
    while (1)
    {
        sum += num;
        num *= 2;
        count++;
        if (sum > 8844430)
        {
            printf("%d\n", count - 1); break;
        }
    }
    return 0;
}

27次
你的count不应该 -1
因为对折1次之后就是0.2mm了

https://zh.
2020-04-13 21:46
return_0
Rank: 8Rank: 8
来 自:五维空间
等 级:禁止访问
威 望:3
帖 子:512
专家分:838
注 册:2020-1-28
收藏
得分:0 
改成位运算更慢了

2020-04-13 21:48
快速回复:[还是代码游戏]对折纸
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021158 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved