2017-02-13 62 views
0

你好我目前正在编写一些类的东西。我们基本上是用信用卡检查器从文本文件中提取数字。我们必须遵守的关于校验位的规则如下。根据位置更改数字

  • 从卡号中删除最后一位数字。最后一位数字是支票 数字。

  • 反转数字。

  • 乘以2.

  • 从任何结果高于9

  • 萨姆所有的数字减去9在奇数位置(1,3,5,等)的数字。

  • 校验位(卡的最后一个数字),是你 需要添加得到的10的倍数的量(模数10)

所以我把校验位远通过设置一个新的变量,并采取卡#/ 10。这是很长的没有小数,所以这摆脱了最后一位数字。然后我使用原始数字的%10将该数字存储为我的校验数字。然后我用一个循环来反转其可以被视为数字:

    long lcards = Long.parseLong(cards);      
        long lastDigit = lcards % 10; 
        long newCard = lcards/10; 

        long reverseCard = 0; 

        while (newCard != 0) 
        { 
         reverseCard = reverseCard * 10; 
         reverseCard = reverseCard + (newCard % 10); 
         newCard = newCard/10; 
        } 

我现在粘在下一步骤:/。我将如何做到这一点?谢谢!

+1

您可能想要将数字存储为字节数组。比使用位操作和计算可能更容易。 –

+0

我究竟该怎么做呢? – bobobobbins

回答

0

下一步:

乘以由2

在奇数位置的数字(1,3,5,等等),需要你迭代所有位在输入数。有两种方法可以做到这一点:

  1. 或多或少与您的第一次尝试摆脱最后一位的 - 你可以使用模/除法运算,以“准入”每个数字在你的电话号码在与以前一样的方式!
  2. 或者,不要在一个数字上工作,请考虑将整个数字转换为一个int值数组;例如;如图所示here。现在您可以迭代该数组并进行必要的计算。 最后,将数组合并成一个数字。你甚至可以这样做预先,摆脱最后一位数字。

希望能帮助你继续锻炼的其余部分!

+0

如果我做到了,第一种方式,但我怎么知道什么时候停止,因为我实际上不知道卡号输入的长度,例如长度为16-19个字符的长方形卡片。 – bobobobbins

+0

我没有得到你的问题。我给你的链接向你展示了如何将任何**号码变成一系列值;不管长度。除此之外,假设你做了'long newCard = lcards/10',只是想一会儿你怎么能检测到你用完了数字。提示:最坏的情况...只需尝试一下,然后打印这些值;看看会发生什么! – GhostCat

+0

对不起,我的问题是关于你做的第一个选择是为了摆脱最后一位数字。我不得不为每个职位创建一个新的变量,尽管这样做是正确的?如果是这样的话,如果我不知道多长时间,我会知道创造多少职位? – bobobobbins