拆数程序的后续
耙子 2006-01-27 03:21:14 应 alphax 的要求,提出我的最终代码
原贴 http://community.csdn.net/Expert/topic/4515/4515392.xml?temp=.245907
我的代码今天早上发现了些错误,所以重新改写了
iNumberCount 是数的个数
ArrNumbers 是存放数的数组
function ChaishuPlus: integer;
type
tByteArray = record
Bytes: array[0..3] of byte;
end;
var
i, j, k, t, s: DWORD;
aTemp: array [0..3] of array [0..$ff] of integer;
begin
//预计算
ZeroMemory(@aTemp, SizeOf(aTemp));
for i:= 0 to 3 do begin // 每个DWORD 4个字节
for j:= 0 to $ff do begin // 每个字节 256种可能
for k:= 0 to 7 do begin // 每个字节 8 位
if (1 shl k) and j <> 0 then begin
aTemp[i][j]:= aTemp[i][j] + ArrNumbers[i*8+k+1];
end;
end;
end;
end;
Result:= 0;
// 防止数组为空
if iNumberCount=0 then
s:= 0
else
s:= (1 shl iNumberCount-1) -1;
// 开始拆解计算
for i:= 1 to s do begin
t:= aTemp[0][tByteArray(i).Bytes[0]] + aTemp[1][tByteArray(i).Bytes[1]] +
aTemp[2][tByteArray(i).Bytes[2]] + aTemp[3][tByteArray(i).Bytes[3]] - sum; // (1)
if t=0 then begin // 这个写法是为了优化(2)
Result:= i;
break;
end;
end;
end;
Result 的各个bit位,如果为1 就代表 相应的ArrNumbers 是结果。
这个就是我的最终代码。
基本上抄袭了alphax 原来的算法,
只是稍微扩展了一下成了32个数的(原来写的64个数的有点问题),他使用空间换时间的思想,空间其实也不大,才4*256*4=4K字节,
但是alphax说 把预计算从8bit变成16bit能快1/5,参看汇编代码之后对此表示一点怀疑。
下面提一下 (1)和(2)部分