双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

拆数程序的后续

耙子 耙子 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
应 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)部分
...全文
评论 25
收藏 已收藏
分享
返回顶部