Алгоритм Луна

а) Начиная с контрольной цифры и двигаясь влево, вычислите сумму всех декодированных цифр. б) Вычислите остаток суммы, используя целочисленное деление на 10. Если результат не равен нулю, номер кредитной карты недействителен. В противном случае номер карты, скорее всего, будет действительным.

Вот два примера:

        Card number: 2315778     Card number 1234567
        decode(8, false) = 8     decode(7, false) = 7
        decode(7, true)  = 5     decode(6, true)  = 3
        decode(7, false) = 7     decode(5, false) = 5
        decode(5, true)  = 1     decode(4, true)  = 8
        decode(1, false) = 1     decode(3, false) = 3
        decode(3, true)  = 6     decode(2, true)  = 4
        decode(2, false) = 2     decode(1, false) = 1

                    Sum = 30                 Sum = 31
               30 mod 10 = 0            31 mod 10 = 1
This number may be valid    This number is invalid

Напишите статический метод с именем checkDigits, которому передается семизначный номер кредитной карты и который выполняет шаги, описанные выше. Повторно используйте метод декодирования, который вы написали в лабораторной работе 5.5.1. Метод должен возвращать слово «действительно», если число проходит проверку, и «недействительно» в противном случае.

import java.util.Scanner;

public class JavaApplication90 
{
    public static void main(String[] args) 
    {
        Scanner scan = new Scanner(System.in);
        int num = 2315778;
        System.out.println("Credit card number: " + num + " is " + checkDigits(num));
        num = 1234567;
        System.out.println("Credit card number: " + num + " is " + checkDigits(num));
        num = 7654321;
        System.out.println("Credit card number: " + num + " is " + checkDigits(num));
        num = 1111111;
        System.out.println("Credit card number: " + num + " is " + checkDigits(num));
    }

    public static boolean checkDigits(int num)
    {
        int sum = 0;
        String reverse = new StringBuffer(num).reverse().toString();
        for (int i = 0; i < reverse.length(); i++){
            int product = 0;
            if (i % 2 == 0)
            {
                product = num * 2;
            }
            if (product < 9)
                product = (product%10)-1;
            sum = sum+ product   ;           
        }
        return (sum % 10 == 0);
    }
}

Выход:

Я получаю истинный/действительный ответ для всех чисел. Я не могу найти свою ошибку. Помощь!


person abcd248    schedule 04.11.2014    source источник
comment
Можете ли вы правильно сделать отступ в своем коде, пожалуйста?   -  person khelwood    schedule 05.11.2014
comment
этот код невозможно прочитать, поэтому, скорее всего, вы допустили ошибку. Пожалуйста, научитесь использовать IDEA и функцию автоматического форматирования. Никогда не размещайте здесь неформатированный код.   -  person Boris the Spider    schedule 05.11.2014
comment
Вы можете использовать отладчик и просматривать переменные по мере их изменения. Если вы не можете использовать отладчик, поместите System.out.println вызовы в checkDigits, чтобы увидеть, как ваши переменные меняются по мере выполнения. Если вы сделаете это, вы увидите, где ваши ошибки.   -  person ajb    schedule 05.11.2014
comment
@BoristheSpider Надеюсь, вы имеете в виду IDE, а не идею.   -  person Dawood ibn Kareem    schedule 05.11.2014
comment
Автозамена @DavidWallace снова срабатывает. Возможно, я имел в виду IDE IDEA...   -  person Boris the Spider    schedule 05.11.2014
comment
Можете ли вы правильно сделать отступ в своем коде, пожалуйста? – сначала он преобразуется в строку   -  person abcd248    schedule 05.11.2014
comment
Можете ли вы правильно сделать отступ в своем коде, пожалуйста? сначала он преобразуется в строку; тогда, если число четное, оно удвоит его, а если оно двузначное, я добавил его. например, если число равно 8 и оно находится в четной позиции, оно удвоится, т.е. 16 и 16 - это две цифры, поэтому я добавляю 1 + 6, что является условием if (product‹9). затем я добавил все числа, и если сумма% 10 дает 0 остатка, это действительно, иначе нет   -  person abcd248    schedule 05.11.2014
comment
@EJP Я не согласен с закрытием этого как дубликата. Это, безусловно, проблема с домашним заданием, и указание на вопрос, содержащий ответ, равносильно выполнению домашнего задания за нее.   -  person ajb    schedule 05.11.2014


Ответы (1)


Есть как минимум три проблемы.

  • Вы не устанавливаете product в случае, когда i нечетно; так что в этом случае product будет 0 и сумма будет неправильной.
  • На самом деле вы не ищете i цифру num. Вы просто используете num оптом каждый раз, когда ссылаетесь на него, тогда как вместо этого вы должны использовать что-то вроде reverse.charAt(i).
  • Создаваемый вами StringBuffer на самом деле пуст — используемый вами конструктор делает не то, что вы думаете. Это означает, что вы вообще не повторяете цикл for. Вам, вероятно, следует проверить Javadocs для более подходящего конструктора StringBuffer для использования.
person Dawood ibn Kareem    schedule 04.11.2014
comment
@Mr.Polywhirl Почему? Нупур попросила нас найти ее проблему. Я нашел ее проблему. Если вы считаете мой ответ неадекватным, то проголосуйте за него. Но комментарии не для того, чтобы вставлять ответы. - person Dawood ibn Kareem; 05.11.2014
comment
Извините, ваш первоначальный ответ был короче, чем сейчас. - person Mr. Polywhirl; 05.11.2014
comment
Не имеет значения. Это все еще был ответ, а не комментарий, потому что он отвечал на вопрос. Хотя изначально он был неполным. Длина не является определяющим критерием ответа. @Мистер Поливирл - person Dawood ibn Kareem; 05.11.2014
comment
Есть больше проблем, чем это. - person ajb; 05.11.2014
comment
(но я надеюсь, что спрашивающий сделает свою собственную отладку и найдет их) - person ajb; 05.11.2014