2011-12-30 45 views
0

我想通过一些号码迭代为02100021,这是一个路由号码,如果它是一个合适的路由号码需要验证。因此,我使用ABA路由号码验证检查为3 *(d1 + d4 + d7)+ 7 *(d2 + d5 + d8)+(d3 + d6 + d9)其中mod 10 = 0因为我有整数类型的数字,我的第一个问题是我如何迭代通过这个数字0,或者如果有一些更简单的方式遍历模式并乘以这样的数字。如何通过迭代通过int中的C的数字的0 0

感谢

回答

3

如果我理解正确,7 * (d2, d5, d8)应该是7 * (d2 + d5 + d8)。 零模10不计数。

bool correct(long x) { 
    long a = x/10 + x/10000 + x/10000000L; 
    long b = x/100 + x/100000L + x/100000000L; 
    long c = x/1000 + x/1000000L + x/1000000000L; 
    int aba_checksum = (int)((3 * a + 7 * b + c) % 10); 
    return aba_checksum == 0; 
} 

更正为d [I] =位* 10 ^(9 - ⅰ)

bool correct(long x) { 
    long a = x/100000000L + x/100000L + x/100; 
    long b = x/10000000L + x/10000L + x/10; 
    long c = x/1000000L + x/1000L + x; 
    int aba_checksum = (int)((3 * a + 7 * b + c) % 10); 
    return aba_checksum == 0; 
} 

模运算可在末端进行。 为了防止溢出(对负数)可能会更早做到这一点,即使7 * b也不会溢出。

+0

我认为这是行不通的,因为你没有掩饰x的先前分裂(即分裂后的值大于10)。 '(x/decimal_place)%10'会解决我相信的问题。 - 未经测试。 – mctylr 2011-12-30 16:25:36

+0

'x/1000 + x/1000000L + x/1000000000L'不给你数字3,6和9的总和。对于x = 123456789,它给出123456 + 123 + 0 = 123579,而不是3 + 6 + 9 = 18 。 – 2011-12-30 16:26:11

+0

这是正确的,我只是试过了,校验和不正确。 – kforkarim 2011-12-30 16:32:33