Как я могу вычислить, действителен ли номер sin, используя эту формулу?

Мой код принимает номер Sin (номер социального страхования) в форме DDD-DDD-DDD, где каждый D - это цифра. Он проверяет, является ли формат допустимым, а затем пытается вычислить, является ли грех допустимым, используя формулу его умножения на 121212121, сложения любых двухзначных чисел вместе, а затем, если после деления на 10, равняется 0, он это реально.

Понятия не имею, как сложить две цифры, полученные в результате умножения.

import java.util.Scanner;

public class SinNumber {
public static void main(String[] args) {        
    Scanner input = new Scanner(System.in);     
    System.out.print("Enter a SIN: ");
String sinNumber = input.nextLine();

boolean validSin = 
        (sinNumber.length() == 11) && 
        (Character.isDigit(sinNumber.charAt(0))) &&
        (Character.isDigit(sinNumber.charAt(1))) &&
        (Character.isDigit(sinNumber.charAt(2))) &&
        (sinNumber.charAt(3) == '-') &&
        (Character.isDigit(sinNumber.charAt(4))) &&
        (Character.isDigit(sinNumber.charAt(5))) &&
        (Character.isDigit(sinNumber.charAt(7))) &&
        (sinNumber.charAt(6) == '-') &&
        (Character.isDigit(sinNumber.charAt(8))) &&
        (Character.isDigit(sinNumber.charAt(9))) &&
        (Character.isDigit(sinNumber.charAt(10)));

    if (validSin = true) { 
        String sinTwo = sinNumber.replace("-", "");         
    }
}
}

Нужно ли умножать каждое число индивидуально? Если да, то как мне это сделать?

Совет от профессионала: if (something == true) всегда можно сократить до if (something)

byxor 26.10.2018 04:44
должен всегда быть
shmosel 26.10.2018 04:45
validSin = true - это задание, а не проверка правды.
Mad Physicist 26.10.2018 04:45

Вы рассматривали его как число? Например, Long.parseLong?

Mad Physicist 26.10.2018 04:47

Делать математику на веревочке ужасно больно.

Mad Physicist 26.10.2018 04:47

Вы слышали о регулярных выражениях?

OneCricketeer 26.10.2018 04:49
if(validSin.matches("(\\d{3}-){2}\\d{3}"))
Kartik 26.10.2018 04:51

если ответ вас устраивает, подумайте о том, чтобы принять его, или прокомментируйте / отредактируйте свое сообщение, чтобы предоставить более подробную информацию

azro 29.10.2018 17:44
0
8
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Этот метод состоит из 2 шагов (Workable Demo):

  1. Проверить форму, проще всего с помощью регулярного выражения: сгруппируйте не менее 3 цифр, разделенных тире

    boolean validSin = sinNumber.matches("\\d{3}-\\d{3}-\\d{3}");
    
  2. Проверить содержание

    • Возьмите каждую цифру одну за другой
    • если цифра находится в нечетном индексе, умножьте на 2
    • если вам больше 10, суммируйте 2 цифры (ex 16 -> 16/10 + 16%10 = 1+6 = 7)
    • суммировать все вместе
    • проверьте, делится ли оно на десять

    if (validSin) {
        String sinTwo = sinNumber.replace("-", "");
        int sum = 0;
        for (int i = 0; i < sinTwo.length(); i++) {
            int digit = Character.getNumericValue(sinTwo.charAt(i));
            if (i % 2 != 0) {
                digit = digit * 2;
            }
            digit = digit / 10 + digit % 10;
            sum += digit;
        }
        validSin = sum % 10 == 0;
    }
    

Кстати, if(validSin = true) неверен, он присвоит значение truevalidSin, а затем оценит результат: true всегда (примитивное равенство выполняется с ==)

Почему вы умножаете только если это нечетный показатель? 6% 2 = 0, но 6 * 2 = 13, что требует сложения. Разве не должно быть, если (i> 5)?

TheHagerboy 26.10.2018 05:06

121 212 121 .. Обратите внимание, что «2» находится только в нечетных индексах .. Умножение на 1 - это то же самое число, поэтому нет необходимости делать это .. Поэтому он умножил на 2, но только для нечетных индексов, потому что там, где оно существует .. Затем он выполняет digit = digit / 10 + digit % 10, который делит число на 10, используя целочисленное деление .. 13 / 10 = 1. 13 % 10 = 3 .. Он добавляет 1 + 3 в соответствии с требованиями ..

Brandon 26.10.2018 05:13

@TheHagerboy Формула заключается в умножении цифр на цифру на 121212121, поэтому индекс события умножается на 1, нечетный индекс на 2, посмотрите на en.wikipedia.org/wiki/Social_Insurance_Number#Validation

azro 26.10.2018 05:13

Моя ошибка, я почему-то подумал, что взято число в SIN, а не от того, на что оно было умножено.

TheHagerboy 26.10.2018 05:14

@TheHagerboy Если это правильно для вас, я позволяю вам принять / проголосовать за ответ;)

azro 26.10.2018 05:20

Другие вопросы по теме