4000个数中找从小到大第50位的数,比较次数不超过4600次
来源:百度知道 编辑:UC知道 时间:2024/05/26 01:47:45
突然有个想法。。。。就是先分配足够大的内存,然后在里面全填上40H(就是inc eax),然后在其开始将eax、ecx清零,然后,对于这4000个数中的每一个数,在其相应的偏移处将多个40H改为以下:
inc ecx
cmp ecx,50
jnz @F
ret
@@:
然后,直接跳到这段内存首处运行。。。返回后根据eax的值就可以计算出第五十个数的值。。。。啊。。这样的话,最少只需要50个cmp,最多需要4000-50=3950个。。。完全符合要求。。。。
又或者,加个SEH回调函数。。。在每个数对应的地方面填入int3....当SEH回调函数发现出错50次后,就可以由EIP与起始地址的差值计算得到相应的数,这样无论如何都只需要比较50次就可以。。。
啊。。。以上只针对win32程度而言。。。只是为了实现这个要求,做不得算法研究用。。。。。。
于是以上只是猜想,先MARK。。我去敲敲代码试试。
------------------------MARK---------------------------
OK,第一种方案成功。。环境是VC++6.0+Windows XP SP3。代码如下:
#include <iostream>
#include <time.h>
using namespace std;
int num[4000];
int main()
{
int eax_count;
int i;
int offset;
char * src;
char final_sc[]="\x41\x83\xF9\x32\x75\x01\xC3";
/*
__asm{
inc ecx 41
cmp ecx,50 83F9 32
jnz LABEL 75