游戏开发论坛

 找回密码
 立即注册
搜索
楼主: tarkey

呵呵,出道题大家做,看谁的方法好。

[复制链接]

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
 楼主| 发表于 2004-6-12 21:16:00 | 显示全部楼层

Re:呵呵,出道题大家做,看谁的方法好。

我的解决方案:
int GetMaxFactor(int a, int b)
{
    if ((a %=  b) == 0) return b;
    else return GetMaxFactor(b, a);
}

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
 楼主| 发表于 2004-6-12 21:30:00 | 显示全部楼层

Re: Re:呵呵,出道题大家做,看谁的方法好。

lobo: Re:呵呵,出道题大家做,看谁的方法好。

其实关键就是a、b的互换,这一次是a%b那下一次一定是b%a,那有什么办法可以减去这个互换的开销呢?其实3楼的...


你的方法有问题,用:
905969664, 838860800
试不出来,但是答案应该是:
33554432

你自己去试试。。。
我一会帖出各个方法的时间消耗。。。

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
 楼主| 发表于 2004-6-12 21:44:00 | 显示全部楼层

Re:呵呵,出道题大家做,看谁的方法好。

用减法的那个方法,执行10000次时间:0.000944533453
我的方法,执行10000次时间:        0.000955428693
位运算的方法,执行10000次时间:    0.001065219183

其他的方法,准确性都有问题。

1

主题

66

帖子

78

积分

注册会员

Rank: 2

积分
78
发表于 2004-6-12 22:08:00 | 显示全部楼层

Re:呵呵,出道题大家做,看谁的方法好。

inline assembler in VC++
int gcd(int a,int b)
{
__asm{
             mov eax,a
             mov ebx,b
    nzloop:
             xor edx,edx
             div ebx  
             test edx,edx
             je zexit
             push edx
             pop eax
             xchg eax,ebx
             jmp nzloop
     zexit:        
              mov a,ebx
        }
     return a;  
}

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
 楼主| 发表于 2004-6-12 22:11:00 | 显示全部楼层

Re:呵呵,出道题大家做,看谁的方法好。

运行时间:0.000857092172
:) 这个速度快。。

1

主题

24

帖子

24

积分

注册会员

Rank: 2

积分
24
发表于 2004-6-12 23:29:00 | 显示全部楼层

Re:呵呵,出道题大家做,看谁的方法好。

真是牛人哪………………佩服的五体投地

不知道楼主是如何测量时间的?

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
 楼主| 发表于 2004-6-12 23:40:00 | 显示全部楼层

Re:呵呵,出道题大家做,看谁的方法好。

static LARGE_INTEGER _tstart, _tend;
static LARGE_INTEGER freq;

void tstart(void)
{
    static int first = 1;

    if(first) {
        QueryPerformanceFrequency(&freq);
        first = 0;
    }
    QueryPerformanceCounter(&_tstart);
}
void tend(void)
{
    QueryPerformanceCounter(&_tend);
}

double tval()
{
    return ((double)_tend.QuadPart -
                (double)_tstart.QuadPart)/((double)freq.QuadPart);
}

然后在你的程序要测时间的地方:
tstart();
//这里是你的代码;
tend();
然后随便找个地方打印tval()就是了。

0

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2004-6-12 23:57:00 | 显示全部楼层

Re:呵呵,出道题大家做,看谁的方法好。

不好意思,我写错了。应该是
int gcd(int a,int b)
{
       while((a %= b) && (b %= a)) ;
        return a | b;
}
你再测试一下。

另外,你是用随机数测试还是同一个数测试10000次?如果是同一个数,那是不足以说明问题的,比如42,24用那个减法的肯定快,1000, 998就未必了。

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
 楼主| 发表于 2004-6-13 07:22:00 | 显示全部楼层

Re:呵呵,出道题大家做,看谁的方法好。

我用的是两个2^20以上的随机数测试的

82

主题

331

帖子

340

积分

中级会员

Rank: 3Rank: 3

积分
340
QQ
发表于 2004-6-13 10:27:00 | 显示全部楼层

Re:呵呵,出道题大家做,看谁的方法好。

Nicememory 你好。

PUSH edx
POP   eax

为什么不写成 MOV eax, edx 呢 ?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-7-1 21:16

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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