【问题标题】:Changing numbers depending on position根据位置更改数字
【发布时间】:2017-02-13 18:31:29
【问题描述】:

您好,我目前正在为课程编写代码。我们基本上是在制作一个信用卡检查器来从文本文件中提取数字。我们必须遵循的校验位规则如下。

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

  • 反转数字。

  • 将奇数位(1、3、5 等)的数字乘以 2。

  • 从任何高于 9 的结果中减去 9。

  • 对所有数字求和。

  • 校验位(卡的最后一个数字)是您支付的金额 需要相加才能获得 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;
                    }

我现在卡在下一步了:/。我该怎么做?谢谢!

【问题讨论】:

  • 您可能希望将数字存储为字节数组。可能比使用位运算和计算更容易。
  • 我该怎么做呢?

标签: java loops


【解决方案1】:

下一步:

将奇数位(1、3、5 等)的数字乘以 2。

这需要您在输入号码中迭代所有位数字。有两种方法可以做到这一点:

  1. 与您第一次尝试删除最后一位数字的尝试大致相同 - 您可以使用模数/除法运算以与以前类似的方式“访问”您号码中的每个数字!
  2. 或者,例如,考虑将整数转换为 int 值数组,而不是处理 一个 数字;如所示here。现在您可以迭代该数组并进行必要的计算。 最后,只需将数组“合并”回一个数字。您甚至可以预先这样做,去掉最后一个数字。

希望这有助于您继续进行其余的练习!

【讨论】:

  • 如果我以第一种方式进行,但我怎么知道何时停止,因为我实际上不知道卡号输入的长度,例如万事达卡的长度可以是 16-19 个字符?
  • 我不明白你的问题。我给您的链接向您展示了如何将 any 数字转换为值序列;不管长度。除此之外;假设你做long newCard = lcards / 10; 只是想一想你怎么能检测到你的数字用完了。提示:最坏的情况......试试吧,然后打印值;看看会发生什么!
  • 对不起,我的问题是关于你做我所做的事情以摆脱最后一位数字的第一个选择。我必须为每个位置创建一个新变量,但要这样做,对吗?如果是这样,如果我不知道多头的长度,我知道要创建多少个头寸?
  • 很抱歉,但 SO 不能这样工作。我们不是指导您完成作业的免费家教服务。特别是对于“作业”类的问题,我们给予提示;但仅此而已。所以应该摆脱那种乒乓/乒乓模式。但是,是的,你可能有 16 到 19 个字符 ;-) ...这就是为什么任何合理的解决方案在使用数组来表示时变得容易得多的原因;即使您仅使用具有除法/模数计算的循环“手动”填充该数组(而不是数字到字符串的转换)。
猜你喜欢
  • 2015-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多