ossilta
算法本身有错误

算法本身有错误, 所以才会有偏差.

计算最后一位校验码时, 前两个步骤有明显错误, 引用原文:

1、将前17位数乘以不同的系数,系数对应表:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

2、将前17位数加上上面的每个数相乘的结果

代码中的实现 :

[mw_shl_code=java,true]num17Tmp += (num17ChTmp + num17ChTmp * multiNum);[/mw_shl_code]

看了这行代码之后发现其实可以让 "num17ChTmp" 所乘的系数 +1 来进行化简, 弄成这样:

[mw_shl_code=java,true]num17Tmp += num17ChTmp * (multiNum + 1);[/mw_shl_code]

于是乎貌似反映出了一个问题.. 前两个步骤合并成了一个步骤:

1、将前17位数乘以不同的系数,系数对应表:8 10 0 6 9 5 3 2 7 4 8 10 0 6 9 5 3

...

似乎有什么不对QAQ..

推度娘, 发现其实原步骤1的系数就是正确的, 而第二个步骤是多余的..

那么如何去修改代码相信大家都知道了, 不多说.

所以接下来..

就要看一下楼主的代码第24行..

[mw_shl_code=java,true]orderNumber = resNum[i-1]; //根据原算法不需要-1,但亲测多一位无奈此处减去1[/mw_shl_code]

为什么会亲测出一个 "-1" 的结果..

从乘以系数求和的地方开始

先假设按照正确的系数求和并除以11的余数为n, 由于求和之前每一项所乘的系数多了 "1", 所以我们实际得到的余数为 (2*n)%11

所以得到如下结果:

正确算法获得的余数: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

我们实际获得的余数: 0, 2, 4, 6, 8, 10, 1, 3, 5, 7, 9

由此推断楼主在测试时使用了特殊数据使得实际得到的余数为 2, 所以才 "无奈 -1"

而后的备注又注明 "24行可以不用-1"

推断是楼主在测试时发现直接 -1 会 get 一个 ArrayIndexOutOfBoundsException..