#include "stdafx.h" #include "math.h" #include "stdlib.h" #include "search.h" #include "memory.h" #include "string.h" #include "windows.h" typedef unsigned long DWORD; #define MAX_N (50) #define TRUE 1 #define FALSE 0 typedef struct { DWORD bitMap; DWORD sum; }SQRT_SUM; typedef struct { DWORD bitMap1; DWORD bitMap2; double sum; }SQRT_SUM_RST; double g_sqrt_arr[MAX_N]; SQRT_SUM *pTab1=NULL; SQRT_SUM *pTab2=NULL; DWORD mask_arr[]= { 1, 1<<1, 1<<2, 1<<3, 1<<4, 1<<5, 1<<6, 1<<7, 1<<8, 1<<9, 1<<10, 1<<11, 1<<12, 1<<13, 1<<14, 1<<15, 1<<16, 1<<17, 1<<18, 1<<19, 1<<20, 1<<21, 1<<22, 1<<23, 1<<24 }; double g_half_sum; int __cdecl ItemCmp( const void *element1, const void *element2 ) { SQRT_SUM *p1,*p2; p1=(SQRT_SUM *)element1; p2=(SQRT_SUM *)element2; if (p1->sum > p2->sum ) return 1; else if (p1->sum sum ) return -1; else return 0; } int InitData() { DWORD i,j; DWORD key,t; double s=0.00; for ( i=0;i=pTab[mid].sum) low=mid; else high=mid-1; } } if ( pTab[low].sum >= n-1) low--; low++; if ( pTab[high].sum <= n+1) high++; high--; *pLow=low; *pHigh=high; return (low<=high); } double getDouble( int tabNo, DWORD key) { double r; int i; for (r=0.00,i=0;i<25;i++) { if (key & mask_arr[i] ) { if (tabNo==0) r+= g_sqrt_arr[i]; else r+= g_sqrt_arr[i+25]; } } return r; } double printfArray(DWORD key1,DWORD key2) { int i; double s=0; printf("["); for (i=0;i<25;i++) { if (key1 & mask_arr[i] ) { printf("%d,",i+1); s+= sqrt( (double)(i+1)); } } for (i=0;i<25;i++) { if (key2 & mask_arr[i] ) { printf("%d,",i+26); s+= sqrt( (double)(i+26)); } } printf("]"); return s; } void search(int lmt,int *pIdx1,int *pIdx2) { int i,j,end; double minDiff=1000000; int idx1,idx2; end=(1<<25)-1; for (i=0;i< (1<<25) ; i++) { double f1,f2; DWORD n1; int high,low; n1= pTab1[i].sum; if ( binSearch(pTab2,lmt-n1,end,&low,&high) ) { f1=getDouble( 0, pTab1[i].bitMap); for (j=low;j<=high;j++) { f2=getDouble( 1, pTab2[j].bitMap); if ( fabs( f1+ f2 - g_half_sum)