首页
社区
课程
招聘
[讨论]给大家出一道有点意思的算法题
发表于: 2007-12-7 10:55 5992

[讨论]给大家出一道有点意思的算法题

2007-12-7 10:55
5992
题目:要求写一个函数, 函数原型为:DWORD func1(DWORD d1);

函数功能要求:当d1为奇数时,d1*func1(d1)=1    当d1为偶数时,d1*func1(d1)=0

说明: d1*func1(d1) 是取的DWORD值, 不是64位的.

有兴趣者,请思考一下,如何编程,有何用途?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 215
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
对1取与就好了。
2007-12-7 13:02
0
雪    币: 2368
活跃值: (81)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
3
func1 = (d1 mod 2)/d1
2007-12-7 13:02
0
雪    币: 266
活跃值: (52)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
4
我要求是有一个函数来实现这个功能,如: 当d1=1234567时,执行:

1234567 * func1(1234567)   相乘的结果是1 , 说明白一点,这个结果是一个64位数据,,但低32位是1

注意, 函数func1返回的是DWORD值, 这个函数func1如何实现?
2007-12-7 14:14
0
雪    币: 290
活跃值: (11)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
5
d1 为奇数 : 011b      (3d)
func1(d1) 功能可以是 return  d1|1 ; (汇编代码 and,d1,1) 011b按位与001
只要0位是置的,就肯定是奇数,反之肯定偶数(2的n次方+2的n-1次方,不加0位的1)!
d1 为偶数 : 010b      (2d)
func1(d1) 功能可以是 return  d1|1 ; (汇编代码 and,d1,1) 010b按位与001
这个值肯定是0 因为 d1的0位不等 1
2007-12-7 23:48
0
雪    币: 290
活跃值: (11)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
6
要求d1为奇数时,d1*func1(d1)=1    当d1为偶数时,d1*func1(d1)=0
可以扩展func1的功能
      return  (d1|1 )/d1;
2007-12-7 23:51
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
int func1(int i){
    if (i % 2)==0 return 1/i;
    else return 0;
}
2007-12-8 00:12
0
雪    币: 266
活跃值: (52)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
8
谢谢大家讨论,不过答案都不满足题目要求,我还是给出答案吧:

#include "stdafx.h"
#include <windows.h>

DWORD func1(DWORD arg_0)
{
        DWORD temp;

_asm{
                mov     eax, 1
                mov     edx, eax        
                mov     esi, arg_0
                sub     edx, esi        
                test    esi, eax
                mov     ecx, edx        
                jnz     short loc_1000A808
                xor     eax, eax
                jmp    sub_1000A7F0
loc_1000A808:                           
                add     eax, ecx
                imul    ecx, edx
                test    ecx, ecx
                jnz     short loc_1000A808
sub_1000A7F0:
                mov        temp,eax
        }
        return temp;       
}

int main(int argc, char** argv)
{
        DWORD d1=12345;
        DWORD x1=d1 * func1(d1);
        return 0;
}

运行这段程序,可以看出,随便给d1一个奇数,x1的结果就是1。

这是从一个软件注册算法中移植过来的代码,觉得这个函数有点意思,就让大家分析一下。

虽然已分析出func1这个函数的功能,但我还是没有弄明白这里面的算法思想,请高手分析指点,谢谢!
2007-12-8 08:24
0
游客
登录 | 注册 方可回帖
返回
//