O CPF é composto por onze dígitos, onde os dois últimos são os dígitos verificadores, que são criados a partir dos nove primeiros.
O cálculo é efetuado em duas etapas utilizando o número 11 como módulo divisor.
Para exemplificar melhor, iremos calcular os dígitos verificadores de um CPF imaginário, por exemplo, 123.123.123-XX.
Primeiro pega-se os nove primeiros dígitos multiplica pelo decréscimo de 10, depois some os valores obtidos.
Ex: soma = 1*10 + 2*9 + 3*8 + 1*7 + 2*6 + 3*5 + 1*4 + 2*3 + 3*2;
Agora pegue o resultado da soma e faça a divisão por 11.
Ex: divisao = soma / 11;
O resultado da divisão será 9 quociente e 3 de resto, faça a subtração de 11 pelo resto da divisão.
Ex: dv = 11 - 3;
O primeiro digito verificador será 8, agora multiplique 8 por 2.
Ex: digito = 8*2;
Agora vamos calcular o segundo digito verificador, dessa vez iremos multiplica os nove primeiros dígitos pelo decréscimo
de 11 e soma com o resultado de 8*2.
Ex: soma= 1*11 + 2*10 + 3*9 + 1*8 + 2*7 + 3*6 + 1*5 + 2*4 + 3*3 +8*2;
Agora pege o resultado da soma e faça a divisão por 11.
Ex: divisao = soma / 11;
O resultado da divisão será 12 quociente e 4 de resto, faça a subtração de 11 pelo resto da divisão.
Ex: dv = 11 - 4;
O segundo digito verificador será 7.
O resultado final será = 123.123.123-XX
Veja abaixo exemplo que fiz em php.
Boa noite companheiro, gostei da lógica do seu código, mas a verificação do segundo digito não funciona como demonstrado, tive que fazer algumas alterações para que desse certo, gostaria de deixar demonstrado para que você possa corrigir o seu, ou possívelmente até enxugar ainda mais a minha solução abaixo demonstrada:
public boolean isValidCPF(ArrayList validate) {
boolean isValid = false;
ArrayList digits = new ArrayList();
ArrayList digitos = new ArrayList();
String cpf = “”;
int add = 0, first_inc = 0, second_inc = 0, first_digit = 0, second_digit = 0, consta = 11;
for(Character c : validate) {
cpf += c.toString();
}
for (Character c : validate) {
digitos.add(c.toString());
}
for(String s : digitos) {
digits.add(Integer.parseInt(s));
}
for (int i=digits.size()-1; i>1; i–) {
add += i * (digits.get(first_inc++));
if (first_inc == 9) break;
}
first_digit = consta – add % consta;
add = 0;
for (int i=digits.size(); i>1; i–) {
if (second_inc == 9) {
add += first_digit * 2;
break;
}
add += i * (digits.get(second_inc++));
}
second_digit = consta – add % consta;
String ld = String.valueOf(second_digit);
int a = Integer.parseInt(cpf.substring(10));
String aa = String.valueOf(ld.charAt(ld.length()-1));
int b = Integer.parseInt(aa);
if (digits.get(digits.size()-2) == first_digit && a == b) {
isValid = true;
}
return isValid;
}