算法本身有错误, 所以才会有偏差.
计算最后一位校验码时, 前两个步骤有明显错误, 引用原文:
1、将前17位数乘以不同的系数,系数对应表:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 22、将前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..