【问题标题】:Sum of the odd-place digits奇数位数之和
【发布时间】:2013-11-07 13:51:34
【问题描述】:

我正在尝试将卡号中的所有其他数字相加:

/*
Return the sum of the odd-place digits.
*/

public static int sumOfoddPlace(long number)
{
    int maxDigitLength = 16;
    int sum = 0;
    for (int i = 1; i <= maxDigitLength; i++)
    {
        if (i % 2 == 1)
        {
            sum = sum + (int)(number % 10);
        }
        break;
    }
    return sum;
}

我得到的只是 6。我要查找的总和应该是 37。

【问题讨论】:

  • 为什么在内部if之后有这个break?这将导致您的 for 只执行一次!
  • 用什么输入得到 6?为什么应该是 37?
  • 删除@StepTNT提到的break

标签: java credit-card luhn


【解决方案1】:

您仅在第一次迭代时就打破了循环。因此,您不会再进行另一次迭代。

但是,删除 break 也不能解决您的问题。 number % 10 将始终为您提供号码的最后一位,而不是每个备用号码。您应该遵循这种方法:

  • num % 10 - 会给你最后一位。
  • 然后通过删除最后 2 位来更新 num
  • 重复

【讨论】:

    【解决方案2】:

    试试这个......这应该适合你

         public static int sumOfoddPlace(long number)
         {
             int maxDigitLength = 16;
             int sum = 0;
             for (int i = 0; i < maxDigitLength; i++)
             {
                 if (i % 2 != 0)
                 {
                     sum =  (sum + (int)(number % 10));
                     number =  number/10;
    
                 }else {
                     number =  number/10;
                }
    
             }
             return sum;
     }
    

    我在这里所做的是,如果i 是奇数,我取一个数字的模,所以我得到数字的最后一位,然后将其添加到 sum,然后通过除以去掉最后一位10,如果数字是偶数,我就去掉ith 位置的数字。

    在这里,我以相反的顺序收集奇数位置的数字。

    【讨论】:

    • 您可以通过将number = number / 10; 移到if 语句之外(和之后)来消除else。实际上,您应该能够将迭代次数减少一半......您还能找到哪些其他改进(请记住,转换通常是一项昂贵的操作)
    • 实际上,现在我仔细研究了一下,您正在收集 other 数字 - 您需要翻转您的条件(假设您更改了for 循环)。
    【解决方案3】:

    我还没有看到最小的解决方案,所以这里是:

    public static int sumOddDigits(long input) {
        int sum = 0;
    
        for (long temp = input; temp > 0; temp /= 100) {
            sum += temp % 10;
        } 
        return sum;
    }
    

    你不需要除以10并检查它是否是偶数,你可以每次除以100。

    演示:http://ideone.com/sDZfpU

    【讨论】:

    • 在 for 循环中初始化 sum 似乎有点奇怪 - 我只是将循环的初始化部分留空(并使用它的声明初始化 sum)。
    • @Clockwork-Muse 我这样做是为了让人们不会对我的 for 循环中的空初始化语句感到害怕。我现在做得更好了。
    【解决方案4】:

    这里是更新的代码,其中我删除了标志的逻辑。这更短,更容易理解。

    public static int sumOfOddDigits(long number){
        int sum = 0;
        String newString = new StringBuilder(String.valueOf(number)).reverse().toString();
        number = Long.parseLong(newString);
    
        while (number != 0){
            sum = (int) (sum + number % 10);
            number = number / 100;
        }
        return sum;
    }
    

    【讨论】:

    • -1 说真的,这个版本是怎么回事?看起来它应该工作...除了它过于复杂并且违反了许多 Java 编码约定。
    • @Clockwork-Muse 我是编程新手,这就是为什么它可能违反了 Java 编码标准,但就代码而言,它完全可以工作,而且似乎并没有复杂...
    • 好吧……你使用的是 flag 值,而你应该使用布尔值。您将输入的数字复制到一个字符串中,将其转换为另一个字符串(以一种完全低效且奇怪的方式,反转字符串),然后返回为一个数字。为了让您能够做到这一点(并遵循您所做的一些约定),您应该遇到了一些应该在此处显示的功能。充其量,这种方法是危险和错误的(它忽略了给出偶数/奇数的尾随零!)...
    • 好的,我明白了,我会记住这些事情,很快就会提出您建议的所有更改...谢谢@Clockwork-Muse
    • ...代码仍然存在一个主要问题-它仍然忽略尾随零(因此仍然危险/错误)-反转它有什么意义?甚至将其转换为字符串?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2021-05-12
    • 2016-03-07
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    相关资源
    最近更新 更多