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