Diego Peres
16 min readApr 5, 2021

Validando CPF: Do algorítmo até o código (PHP, Python, JavaScript)

Com uma busca rápido, você encontra na internet vários algorítmos para validar um CPF (Cadastro de Pessoa Física) de forma eficiente. Porém, você já pensou como é o cálculo por trás? :O

Hoje, vamos juntos descobrir como funciona o cálculo do CPF, construir um algorítmo para fazer esse cálculo e adapatar para algumas linguagens de programação (PHP, JS e Python)

Obs.: Se você não tiver paciência para ver como é feito o cálculo e a forma que eu pensei para chegar no algorítmo pode ir para o final desse artigo que tem todos os códigos prontos para copiar e colar :D
Mas, se você fizer isso não estará evoluindo como um programador, apenas como um copiador :O

Entendo o cálculo de validação do CPF

O CPF assim como outros documentos oficiais, possuem alguns números que são considerados DV (Dígitos Verificadores). São os números utilizados para verificar se o documento é valido ou não.
Esse cálculo é implementado no próprio software, sem a necessidade de qualquer conexão com a receita federal. Assim, evita erros de digitação ou algum tipo de golpe. Após, essa primeira validação, alguns sistemas fazem uma conexão com a Receita Federal para validar se aquele pessoa pertence aquele CPF.

No CPF existem dois (02) DV para validação, que são os dois (02) últimos números depois do traço (-).

Vamos utilizar o seguinte CPF (Fictício) como exemplo: 111.222.333–96

Calculando o primeiro DV

Para realizar o cálculo do primeiro DV, tempos que que fazer um cálculo com os primeiros nove (09) números. Temos que múltiplicar esses nove (09) números por dez (10) até dois (02) e depois somar os resultados … O que!?!?!?
Deixa eu mostrar abaixo :D

Com o resultado final de noventa (90), vamos dividí-lo por onze (11). Porém, não vamos utilizar o resultado da divisão e sim o resto:

90 % 11 = 2

Caso o resto seja dez (10) ou maior, então o DV será zero (0). Como não é nenhum desses números, vamos pegar o resto e subtrair por onze (11):

11–2 = 9

Então, o primeiro DV é nove (09) e o décimo digito do CPF de exemplo é nove (09), significando que esse número é valido.

Calculando o segundo DV

Para realizar o cálculo do segundo DV é quase o mesmo processo que o primeiro DV. Porém, vamos utilizar os dez (10) primeiro números, multiplicar por 11 e ir caindo e somar os resultado … Agora entendi :D

O resultado foi cento e vinte e seis (126), vamos dividir esse resultado por onze (11) e vamos utilizar o resto da divisão:

126 % 11 = 5

Caso, o resto da divisão seja dez (10) ou número maior, então, o DV será zero (0). Então, vamos pegar o resto da divisão e subtrair por onze (11)

11–5 = 6

Então, como podemos ver o nosso CPF (fictício) 111.222.333–96 é válido, pois, o primeiro DV (9) está igual ao décimo digito e o segundo DV (6) é igual ao décimo primeiro dígito.

Criando o algorítimo

Agora, que já sabemos como funciona o cálculo do CPF, vamos implementar isso em um algorítmo para ser utilizado em qualquer linguagem. Iremos fazer isso em apenas cinco (05) passos:

Passo 1: Extrair os primeiros nove (09) dígitos do CPF
Passo 2: Fazer as multiplicações e somas com os nove (09) dígitos
Passo 3: Descobrir o primeiro DV (Dígito Verificador)
Passo 4: Descobrir o segundo DV (Dígito Verificador)
Passo 5: Validando o número digitado

Vamos utilizar a seguinte estrutura básica para montar o nosso algorítmo:

algoritmo “validorCPF”
var
inicio
fimalgoritmo

Passo 1: Extrair os primeiros nove (09) dígitos do CPF

O primeiro passo é extrair os primeiros nove (09) dígitos e colocar em um variável.

Então, vamos fazer o seguinte, criar uma variável para comportar o CPF recebido (Espero que você já tenha bloqueado letras e caracteres especiais nesse campo anteriormente :O) e inicializar ela com o valor do CPF (Utilizarei o valor do primeiro exemplo):

algoritmo “validorCPF”
var
cpfRecebido: Caractere
inicio
cpfRecebido <- “11122233396”
fimalgoritmo

Obs.: Criei essa variável do tipo caractere, pois, se o CPF iniciar com zero (0) ela será considerado no resto do programa. Caso, a variável fosse do tipo inteiro, ele seria ignorado.

Para ficar mais fácil, vamos pegar esse CPF recebido e colocar em uma variável do tipo Matriz. Assim, vamos pode extrair quantos números do CPF for necessário facilmente.

algoritmo “validorCPF”
var
cpfRecebido: Caractere
cpf: Matriz
inicio
cpfRecebido <- “11122233396”
cpf <- funcaoSeparadora (cpfRecebido)
fimalgoritmo

Obs.: “funcaoSeparadora” será a função utilizada na linguagem de programação para transformar a variável “cpfRecebido” em Matriz.

Como o CPF está dentro de uma Matriz, podemos utilizar uma repetição para listar todos os nove (09) primeiros dígitos do CPF. Iremos, utilizar a repetição “Para”.

Na maioria das linguagens de programação (Falo maioria, pois, pode ter alguma linguagem que seja diferente :O), o primeiro elemento da Matriz tem o índice zero (0), então, vamos listar tudo de zero (0) até oito (08);

algoritmo “validorCPF”
var
cpfRecebido: Caractere
cpf: Matriz
inicio
cpfRecebido <- “11122233396”
cpf <- funcaoSeparadora (cpfRecebido)
Para i <- 0 ate 8 passo 1 faca
Escreva (cpf[i])
FimPara
fimalgoritmo

O resultado do programa será:

[1, 1, 1, 2, 2, 2, 3, 3, 3,]

Passo 2: Fazer as multiplicações e somas com os nove (09) dígitos

Agora temos que fazer aquelas multiplicações e somas que está explicado na primeira parte de artigo (O que?!?! Não acredito que você está começando essa artigo por aqui ? :O)

Então, vamos fazer o seguinte, dentro da repetição “Para”, vamos fazer com os primeiros nove (09) dígitos do CPF, sejam multiplicados pelos números corretos (10, 9, 8, 7, 6, 5, 4, 3, 2).

Como a variável temporária “i” está indo de zero (0) até oito (08), podemos ir subtraindo cada repetição para chegar ao número correto:

i = 0, então, 0–10 = 10
i = 1, então, 1–10 = 9
i = 2, então, 2–10 = 8

E assim por diante …

Vamos multiplicar e colocar dentro de uma variável chamada “resultadoMultiplicacaoPDV” (Esse PDV do final significa “Primeiro Dígito Verificador”), essa variável será do tipo “inteiro”;

algoritmo “validorCPF”
var
cpfRecebido: Caractere
resultadoMultiplicacaoPDV: inteiro
cpf: Matriz
inicio
cpfRecebido <- “11122233396”
cpf <- funcaoSeparadora (cpfRecebido)
resultadoMultiplicacaoPDV = 0
Para i <- 0 ate 8 passo 1 faca
resultadoMultiplicacaoPDV <- cpf[i] * (10 — i)
Escreva (resultadoMultiplicacaoPDV)
FimPara
fimalgoritmo

Resultado do programa será:

10
9
8
14
12
10
12
9
6

Maravilha, está funcionando do jeito que precisamos :D

Obs.: É muito melhor ir fazendo, testando, fazendo testando, do que digitar tudo e deixar para testar no final. Pois, se tiver algum problema já corrimos agora, depois com várias linhas de código será muito difícil localizar o erro :O

Como o nosso programa já está fazendo a multiplicação dos números, temos que fazer o somatórios deles também. Porém, não podemos colocar a soma do lado de fora do “Para” pois, iria somar somente o resultado final e o que queremos, é a soma de cada operação.

Então, criaremos uma variável chamada “resultadoSomaPDV” (Que também será do tipo “inteiro”) para guardar o resultado da soma de operação.
Utilizaremos a seguinte estrutura:
resultadoSomaPDV = resultadoSomaPDV + resultadoMultiplicacaoPDV

Talvez, vendo no linha a linha vai ficar mais fácil de entender:

resultadoSomaPDV = 0 + 10
resultadoSomaPDV = 10 + 9
resultadoSomaPDV = 19 + 8

E assim, por diante …
No programa vai ficar da seguinte forma:

algoritmo “validorCPF”
var
cpfRecebido: Caractere
resultadoMultiplicacaoPDV, resultadoSomaPDV: inteiro
cpf: Matriz
inicio
cpfRecebido <- “11122233396”
cpf <- funcaoSeparadora (cpfRecebido)
resultadoMultiplicacaoPDV <- 0
resultadoSomaPDV <- 0
Para i <- 0 ate 8 passo 1 faca
resultadoMultiplicacaoPDV <- cpf[i] * (10 — i)
resultadoSomaPDV <- resultadoSomaPDV + resultadoMultiplicacaoPDV
Escreva (resultadoSomaPDV)
FimPara
fimalgoritmo

Resultado do programa será:

10
19
27
41
53
63
75
84
90

Que alegria saber que está tudo funcionando corretamente, vamos para o próximo passo :D

Passo 3: Descobrir o primeiro DV (Dígito Verificador)

Como vimos anteriormente, depois de fazer as multiplicações e somas, temos que pegar esse resultado dividir por onze (11), com o resto da divisão subtrair de onze (11), assim chegaremos no primeiro DV.

Criarei uma variável chamada “restoSomaPDV” e vamos atribuir o resto da divisão de onze (11):

algoritmo “validorCPF”
var
……
resultadoMultiplicacaoPDV, resultadoSomaPDV, restoSomaPDV: inteiro
……
inicio
……
restoSomaPDV <- 0
……
restoSomaPDV = resultadoSomaPDV % 11
Escreva (restoSomaPDV)
fimalgoritmo

Resultado do programa será:

2

Conforme visto acima, se o resto for maior do que dez (10), então, o dígito verificador será zero (0), caso contrário será o dígito verificador menos onze (11).
Então, vamos fazer uma estrutura “Se” para validar essa parte e colocar o resultado do primeiro DV em uma variável chamada “pdv”;

algoritmo “validorCPF”
var
……
pdv: inteiro
……
inicio
……
pdv <- 0
……
Se (resultadoRestoPDV >= 10) então
pdv <- 0
senao
pdv <- (11 — resultadoRestoPDV)
FimSe
Escreva (pdv)
fimalgoritmo

Resultado do programa será:

9

Agora, que já temos a estrutura para chegar no primeiro dígito verificador, podemos prosseguir :D

Passo 4: Descobrir o segundo DV (Dígito Verificador)

Como assim ?!?! Cadê os outros passos ?!?!?
Isso mesmo que você leu, já podemos ir direto calculando o segundo DV. Pois, o cálculo é muito parecido com o primeiro.
Porém, no primeiro é feito a multiplicação de dez (10) até dois (2) no segundo é feito de onze (11) até dois (2) e utiliza os primeiro dez (10) dígitos.

Vamos copiar e colar o código, porém, vamos criar novas variáveis para o segundo DV.
Novas variáveis equivalentes:

resultadoSomaPDV” é o mesmo que “resultadoSomaSDV”
resultadoMultiplicacaoPDV” é o mesmo que “resultadoMultiplicacaoSDV”
restoSomaPDV” é o mesmo que “restoSomaSDV”
pdv” é o mesmo que “sdv”

algoritmo “validorCPF”
var
……
resultadoMultiplicacaoSDV, resultadoSomaSDV, restoSomaSDV: inteiro
pdv, sdv: inteiro
……
inicio
……
resultadoMultiplicacaoSDV <- 0
resultadoSomaSDV <- 0
restoSomaSDV <- 0
sdv <- 0
……
Para i <- 0 ate 9 passo 1 faca
resultadoMultiplicacaoSDV <- cpf[i] * (11 — i)
resultadoSomaSDV <- resultadoSomaSDV + resultadoMultiplicacaoSDV
FimPara
restoSomaSDV = resultadoSomaSDV % 11
Se (resultadoRestoSDV >= 10) então
sdv <- 0
senao
sdv <- (11 — resultadoRestoSDV)
FimSe
Escreva (pdv)
Escreva(sdv)
fimalgoritmo

Resultado do programa será:

9
6

Maravilha, temos o primeiro e segundo DV, então, acabou o programa, certo? :D
Errado ! :(

Vamos para o próximo passo.

Passo 5: Validando o número digitado

Agora que já temos o cálculo que chega nos dois (02) DV, temos que validar se o número digitado no CPF é realmente um CPF válido.

Então, é muito simples, vamos adicionar uma estrutura “Se” e comparar a variável “pdv” com o décimo dígito do CPF (cpf[9]) e a variável “sdv” com o décimo primeiro dígito do CPF (cpf[10)

algoritmo “validorCPF”
var
……
inicio
……
Se (cpf[9] = pdv) e (cpf[10] = sdv) entao
Escreva (“CPF valido”)
senao
Escreva (“CPF invalido”)
FimSe
fimalgoritmo

Resultado do programa será:

CPF valido

Como pensamos em um CPF (FICTÍCIO) válido, o resultado foi “CPF válido”. Porém, temos que validar uma última coisa em nosso sistema.
Se a pessoa digitar todos os números iguais (2222222, 33333, …) vai dar no final “CPF válido”. Então, temos que prevenir isso também.

Vamos criar uma variável chamada “cpfInvalido” e vamos colocar toda listagem de números repetidos: 111111111111, 222222222222, 33333333333, 44444444444, 5555555555, 66666666666, 77777777777, 88888888888, 9999999999, 0000000000

algoritmo “validorCPF”
var
……
cpf, cpfInvalido: Matriz
inicio
……
cpfInvalido <- [00000000000, 11111111111, 22222222222, 33333333333, 44444444444, 55555555555, 66666666666, 77777777777, 88888888888, 99999999999]
……
fimalgoritmo

Agora, vamos fazer um “Para” para comparar todos os valores que estão na variável “cpfInvalido” com o valor recebido no CPF.
E criaremos uma variável chamada “situacao”, caso a situacao em alguma dessas repetições for “Verdadeira”, então, ele vai guardar essa valor para ser validado no “Se” final

algoritmo “validorCPF”
var
……
situacao: boleano
inicio
……
Para i <- 0 ate 9 passo 1 faca
Se (cpfRecebido = cpfInvalido[i]) entao
situacao <- “Verdadeiro”
Parar
senao
situacao = “Falso”
FimSe
FimPara
……
fimalgoritmo

E agora vamos incrementar o último “Se” com essa nova condição, se o valor de “situacao” for igual a “Verdadeiro”, então, o CPF é inválido.

algoritmo “validorCPF”}
var
……
situacao: boleano
inicio
……
Para i <- 0 ate 9 passo 1 faca
Se (cpfRecebido = cpfInvalido[i]) entao
situacao <- “Verdadeiro”
Parar
senao
situacao = “Falso”
FimSe
FimPara
Se (situacao = “Verdadeiro”) entao
Escreva (“CPF invalido”)
senao
Se (cpf[9] = pdv) e (cpf[10] = sdv) entao
Escreva (“CPF valido”)
senao
Escreva (“CPF invalido”)
FimSe
FimSe
……
fimalgoritmo

O algorítmo completo fica da seguinte forma:

algoritmo “validorCPF”
var
cpfRecebido: Caractere
resultadoSomaPDV, resultadoMultiplicacaoPDV: Inteiro
resultadoSomaSDV, resultadoMultiplicacaoSDV: Inteiro
situacao: Logico
cpf, cpfInvalido: Matriz
inicio
cpfRecebido <- “11122233396”
cpf <- funcaoSeparadora (cpfRecebido)
resulatdoSomaPDV <- 0
resultadoMultiplicacaoPDV <- 0
resultadoSomaSDV <- 0
resultadoMultiplicacaoSDV <- 0
cpfInvalido <- [00000000000, 11111111111, 22222222222, 33333333333, 44444444444, 55555555555, 66666666666, 77777777777, 88888888888, 99999999999]
Para i <- 0 ate 8 passo 1 faca
resultadoMultiplicacaoPDV <- cpf[i] * (10 — i)
resultadoSomaPDV <- resultadoSomaPDV + resultadoMultiplicacaoPDV
FimPara
resultadoRestoPDV <- resultadoSomaPDV % 11
Se (resultadoRestoPDV >= 10) entao
pdv <- 0
Senao
pdv <- (11 — resultadoRestoPDV)
FimSe
Para i <- 0 ate 9 passo 1 faca
resultadoMultiplicacaoSDV <- cpf[i] * (11 — i)
resultadoSomaSDV <- resultadoSomaSDV + resultadoMultiplicacaoSDV
FimPara
resultadoRestoSDV <- resultadoSomaSDV % 11
Se (resultadoRestoSDV >= 10)
sdv <- 0
senao
sdv <- (11 — resultadoRestoSDV)
FimSe
Para i <- 0 ate 9 passo 1 faca
Se (cpfRecebido = cpfInvalido[i]) entao
situacao <- “Verdadeiro”
Parar
senao
situacao = “Falso”
FimSe
FimPara
Se (situacao = “Verdadeiro”) entao
Escreva (“CPF invalido”)
senao
Se (cpf[9] = pdv) e (cpf[10] = sdv) entao
Escreva (“CPF valido”)
senao
Escreva (“CPF invalido”)
FimSe
FimSe
fimalgoritmo

Transcrição para outras linguagens

Como temos o algorítmo pronto, podemos recriá-lo em qualquer liguagem de programação. Nesse artigo vamos utilizar três (03) linguagens, PHP, Python e JavaScript.

Começaremos com a transcrição das variáveis.

Em algorítmo

algoritmo “validadorCPF”
var
cpfRecebido: Caractere
resultadoSomaPDV, resultadoMultiplicacaoPDV: Inteiro
resultadoSomaSDV, resultadoMultiplicacaoSDV: Inteiro
situacao: Logico
cpf, cpfInvalido: Matriz
inicio
cpfRecebido <- “11122233396”
cpf <- funcaoSeparadora (cpfRecebido)
resulatdoSomaPDV <- 0
resultadoMultiplicacaoPDV <- 0
resultadoSomaSDV <- 0
resultadoMultiplicacaoSDV <- 0
cpfInvalido <- [00000000000, 11111111111, 22222222222, 33333333333, 44444444444, 55555555555, 66666666666, 77777777777, 88888888888, 99999999999]

Em PHP

No PHP não é necessário informar qual é o seu tipo e tem que inciada com o símbolo ($).
Lembrando que no PHP é obrigatório o uso do ponto e vírgula (;) no final de cada inscrição :O

$cpfRecebido = “11122233396”;
$cpf = str_split($cpfRecebido);
$cpfInvalido = array(00000000000, 11111111111, 22222222222, 33333333333, 44444444444, 55555555555, 66666666666, 77777777777, 88888888888, 99999999999);
$resultadoSomaPDV = 0;
$resultadoMultiplicacaoPDV = 0;
$resultadoSomaSDV = 0;
$resultadoMultiplicacaoSDV = 0;
$situacao = 0;

Em Python

Assim, como no PHP não é necessário informar o tipo da variável e não é obrigatório utilização do ponto e vírgula :D
Porém, tive que utilizar um “for” para converter a variável que recebe o número do CPF em caractere, para matriz com inteiros;

cpfRecebido = str(11122233396)
cpf = []
for i in cpfRecebido:
cpf.append(int(i))
cpfInvalido = [00000000000, 11111111111, 22222222222, 33333333333, 44444444444, 55555555555, 66666666666, 77777777777, 88888888888, 99999999999]
resultadoSomaPDV = 0
resultadoMultiplicacaoPDV = 0
resultadoSomaSDV = 0
resultadoMultiplicacaoSDV = 0
situacao = False

Em JavaScript

Assim como no PHP e Python, no JavaScript não é necessário informar o tipo da variável e o código é bem parecido com o algorítmo

let cpfRecebido = “11122233396”
let cpf = cpfRecebido.split(“”)
let cpfInvalido = [00000000000, 11111111111, 22222222222, 33333333333, 44444444444, 55555555555, 66666666666, 77777777777, 88888888888, 999999999]
let resultadoSomaPDV = 0
let resultadoMultiplicacaoPDV = 0
let resultadoSomaSDV = 0
let resultadoMultiplicacaoSDV = 0
let situacao = 0

Agora, podemos fazer a podemos transcrever a parte que calcula o primeiro DV. Nas três (03) linguagens de programação (PHP, Python e JavaScript) temos o operador ternário, com isso é possível resumir a estrutura do “Se” em apenas uma (01) linha.

Em algorítmo

Para i <- 0 ate 8 passo 1 faca
resultadoMultiplicacaoPDV <- cpf[i] * (10 — i)
resultadoSomaPDV <- resultadoSomaPDV + resultadoMultiplicacaoPDV
FimPara
resultadoRestoPDV <- resultadoSomaPDV % 11
Se (resultadoRestoPDV >= 10) entao
pdv <- 0
Senao
pdv <- (11 — resultadoRestoPDV)
FimSe

Em PHP

for ($i = 0; $i <= 8; $i++){
$resultadoMultiplicacaoPDV = $cpf[$i] * (10 — $i);
$resultadoSomaPDV = $resultadoSomaPDV + $resultadoMultiplicacaoPDV;
}
$resultadoRestoPDV = $resultadoSomaPDV % 11;
$pdv = ($resultadoRestoPDV >= 10) ? 0 : (11 — $resultadoRestoPDV);

Em Python

for i in range(0, 9):
resultadoMultiplicacaoPDV = cpf[i] * (10 — i)
resultadoSomaPDV = resultadoSomaPDV + resultadoMultiplicacaoPDV
resultadoRestoPDV = resultadoSomaPDV % 11
pdv = 0 if resultadoRestoPDV >= 10 else (11 — resultadoRestoPDV)

Em JavaScript

for (i = 0; i <= 8; i++)
{
resultadoMultiplicacaoPDV = cpf[i] * (10 — i)
resultadoSomaPDV = resultadoSomaPDV + resultadoMultiplicacaoPDV
}
resultadoRestoPDV = resultadoSomaPDV % 11
pdv = (resultadoRestoPDV >= 10) ? 0 : (11 — resultadoRestoPDV)

Continuando nossa transcrição, podemos ir para o cálculo do segundo DV, que é bem parecido com o cálculo do primeiro, porém, são utilizado os dez (10) primeiros números.

Em Algorítmo

Para i <- 0 ate 9 passo 1 faca
resultadoMultiplicacaoSDV <- cpf[i] * (11 — i)
resultadoSomaSDV <- resultadoSomaSDV + resultadoMultiplicacaoSDV
FimPara
resultadoRestoSDV <- resultadoSomaSDV % 11
Se (resultadoRestoSDV >= 10)
sdv <- 0
senao
sdv <- (11 — resultadoRestoSDV)
FimSe

Em PHP

for ($i = 0; $i <= 9; $i++) {
$resultadoMultiplicacaoSDV = $cpf[$i] * (11 — $i);
$resultadoSomaSDV = $resultadoSomaSDV + $resultadoMultiplicacaoSDV;
}
$resultadoRestoSDV = $resultadoSomaSDV % 11;
$sdv = ($resultadoRestoSDV >= 10) ? 0 : (11 — $resultadoRestoSDV);

Em Python

for i in range(0, 10):
resultadoMultiplicacaoSDV = cpf[i] * (11 — i)
resultadoSomaSDV = resultadoSomaSDV + resultadoMultiplicacaoSDV
resultadoRestoSDV = resultadoSomaSDV % 11
sdv = 0 if resultadoRestoSDV >= 10 else (11 — resultadoRestoSDV)

Em JavaScript

for (i = 0; i <= 9; i++)
{
resultadoMultiplicacaoSDV = cpf[i] * (11 — i)
resultadoSomaSDV = resultadoSomaSDV + resultadoMultiplicacaoSDV
}
resultadoRestoSDV = resultadoSomaSDV % 11
sdv = (resultadoRestoSDV >= 10) ? 0 : (11 — resultadoRestoSDV)

Vamos para a parte que verifica se o número digitado no CPF são aqueles casos de todos os números repetidos

Em Algorítimo

Para i <- 0 ate 9 passo 1 faca
Se (cpfRecebido = cpfInvalido[i]) entao
situacao <- “Verdadeiro”
Parar
senao
situacao = “Falso”
FimSe
FimPara

Em PHP

for ($i = 0; $i <= 9; $i++) {
if($cpfRecebido == $cpfInvalido[$i]) {
$situacao = true;
break;
} else {
$situacao = false;
}
}

Em Python

for i in range(0, 10):
if cpfRecebido == cpfInvalido[i]:
situacao = True
break
else:
situacao = False

Em JavaScript

for (i = 0; i<= 9; i++){
if(cpfRecebido == cpfInvalido[i]) {
situacao = true
break
} else {
situacao = false
}
}

E finalmente a última parte (Minha cabeça já estava dando um nó, por ficar trocando tanto de lingaugem kkkk)
Nessa parte que é feita a validação final verificando se tem algum número repetido no código e se, o primeiro DV é igual ao décimo número do CPF, e o segundo DV é igual ao décimo primeiro número do CPF

Em Algorítimo

Se (situacao = “Verdadeiro”) entao
Escreva (“CPF invalido”)
senao
Se (cpf[9] = pdv) e (cpf[10] = sdv) entao
Escreva (“CPF valido”)
senao
Escreva (“CPF invalido”)
FimSe
FimSe

Em PHP

if ($situacao) {
echo(“CPF inválido”);
} else if(($cpf[9] == $pdv) and ($cpf[10] == $sdv)) {
echo (“CPF válido”);
} else {
echo(“CPF inválido”);
}

Em Python

if(situacao):
print(‘CPF invalido’)
elif (cpf[9] == pdv) and (cpf[10] == sdv):
print(‘CPF valido’)
else:
print(‘CPF invalido’)

Em JavaScript

if (situacao) {
console.log(‘CPF inválido’)
} else {
if (cpf[9] == pdv && cpf[10] == sdv) {
console.log(“CPF válido”)
} else {
console.log(“CPF inválido”)
}
}

Então é isso, espero que a forma que cheguei na resolução desse problema tenha agregado em algo na sua construção de raciocínio na lógida de programação. Porém, existem várias formas de fazer a mesma coisa na programação. Eu quero lhe convidar a utilizar a caixa de comentários abaixo para colocar a sua solução, ou mesmo alguma coisa que poderia ser melhorado nesse algorítmo.
Abaixo, estarei colocando o código completo de cada linguagem para os seus testes.

Muito obrigado por sua atenção, até a próxima :D

Algorítimo completo

algoritmo “validadorCPF”
var
cpfRecebido: Caractere
resultadoSomaPDV, resultadoMultiplicacaoPDV: Inteiro
resultadoSomaSDV, resultadoMultiplicacaoSDV: Inteiro
situacao: Logico
cpf, cpfInvalido: Matriz
inicio
cpfRecebido <- “11122233396”
cpf <- funcaoSeparadora (cpfRecebido)
resulatdoSomaPDV <- 0
resultadoMultiplicacaoPDV <- 0
resultadoSomaSDV <- 0
resultadoMultiplicacaoSDV <- 0
cpfInvalido <- [00000000000, 11111111111, 22222222222, 33333333333, 44444444444, 55555555555, 66666666666, 77777777777, 88888888888, 99999999999]
Para i <- 0 ate 8 passo 1 faca
resultadoMultiplicacaoPDV <- cpf[i] * (10 — i)
resultadoSomaPDV <- resultadoSomaPDV + resultadoMultiplicacaoPDV
FimPara
resultadoRestoPDV <- resultadoSomaPDV % 11
Se (resultadoRestoPDV >= 10) entao
pdv <- 0
Senao
pdv <- (11 — resultadoRestoPDV)
FimSe
Para i <- 0 ate 9 passo 1 faca
resultadoMultiplicacaoSDV <- cpf[i] * (11 — i)
resultadoSomaSDV <- resultadoSomaSDV + resultadoMultiplicacaoSDV
FimPara
resultadoRestoSDV <- resultadoSomaSDV % 11
Se (resultadoRestoSDV >= 10)
sdv <- 0
senao
sdv <- (11 — resultadoRestoSDV)
FimSe
Para i <- 0 ate 9 passo 1 faca
Se (cpfRecebido = cpfInvalido[i]) entao
situacao <- “Verdadeiro”
Parar
senao
situacao = “Falso”
FimSe
FimPara
Se (situacao = “Verdadeiro”) entao
Escreva (“CPF invalido”)
senao
Se (cpf[9] = pdv) e (cpf[10] = sdv) entao
Escreva (“CPF valido”)
senao
Escreva (“CPF invalido”)
FimSe
FimSe
fimalgoritmo

Código PHP completo

<?php
$cpfRecebido = “11122233396”;
$cpf = str_split($cpfRecebido);
$cpfInvalido = array(00000000000, 11111111111, 22222222222, 33333333333, 44444444444, 55555555555, 66666666666, 77777777777, 88888888888, 99999999999);
$resultadoSomaPDV = 0;
$resultadoMultiplicacaoPDV = 0;
$resultadoSomaSDV = 0;
$resultadoMultiplicacaoSDV = 0;
$situacao = 0;
for ($i = 0; $i <= 8; $i++){
$resultadoMultiplicacaoPDV = $cpf[$i] * (10 — $i);
$resultadoSomaPDV = $resultadoSomaPDV + $resultadoMultiplicacaoPDV;
}
$resultadoRestoPDV = $resultadoSomaPDV % 11;
$pdv = ($resultadoRestoPDV >= 10) ? 0 : (11 — $resultadoRestoPDV);
for ($i = 0; $i <= 9; $i++) {
$resultadoMultiplicacaoSDV = $cpf[$i] * (11 — $i);
$resultadoSomaSDV = $resultadoSomaSDV + $resultadoMultiplicacaoSDV;
}
$resultadoRestoSDV = $resultadoSomaSDV % 11;
$sdv = ($resultadoRestoSDV >= 10) ? 0 : (11 — $resultadoRestoSDV);
for ($i = 0; $i <= 9; $i++) {
if($cpfRecebido == $cpfInvalido[$i]) {
$situacao = true;
break;
} else {
$situacao = false;
}
}
if ($situacao) {
echo(“CPF inválido”);
} else if(($cpf[9] == $pdv) and ($cpf[10] == $sdv)) {
echo (“CPF válido”);
} else {
echo(“CPF inválido”);
}
?>

Código Python completo

cpfRecebido = str(11122233396)
cpf = []
for i in cpfRecebido:
cpf.append(int(i))
cpfInvalido = [00000000000, 11111111111, 22222222222, 33333333333, 44444444444, 55555555555, 66666666666, 77777777777, 88888888888, 99999999999]
resultadoSomaPDV = 0
resultadoMultiplicacaoPDV = 0
resultadoSomaSDV = 0
resultadoMultiplicacaoSDV = 0
situacao = False
for i in range(0, 9):
resultadoMultiplicacaoPDV = cpf[i] * (10 — i)
resultadoSomaPDV = resultadoSomaPDV + resultadoMultiplicacaoPDV
resultadoRestoPDV = resultadoSomaPDV % 11
pdv = 0 if resultadoRestoPDV >= 10 else (11 — resultadoRestoPDV)
for i in range(0, 10):
resultadoMultiplicacaoSDV = cpf[i] * (11 — i)
resultadoSomaSDV = resultadoSomaSDV + resultadoMultiplicacaoSDV
resultadoRestoSDV = resultadoSomaSDV % 11
sdv = 0 if resultadoRestoSDV >= 10 else (11 — resultadoRestoSDV)
for i in range(0, 10):
if cpfRecebido == cpfInvalido[i]:
situacao = True
break
else:
situacao = False
if(situacao):
print(‘CPF invalido’)
elif (cpf[9] == pdv) and (cpf[10] == sdv):
print(‘CPF valido’)
else:
print(‘CPF invalido’)

Código JavaScript completo

let cpfRecebido = “11122233396”
let cpf = cpfRecebido.split(“”)
let cpfInvalido = [00000000000, 11111111111, 22222222222, 33333333333, 44444444444, 55555555555, 66666666666, 77777777777, 88888888888, 999999999]
let resultadoSomaPDV = 0
let resultadoMultiplicacaoPDV = 0
let resultadoSomaSDV = 0
let resultadoMultiplicacaoSDV = 0
let situacao = 0
for (i = 0; i <= 8; i++)
{
resultadoMultiplicacaoPDV = cpf[i] * (10 — i)
resultadoSomaPDV = resultadoSomaPDV + resultadoMultiplicacaoPDV
}
resultadoRestoPDV = resultadoSomaPDV % 11
pdv = (resultadoRestoPDV >= 10) ? 0 : (11 — resultadoRestoPDV)
for (i = 0; i <= 9; i++)
{
resultadoMultiplicacaoSDV = cpf[i] * (11 — i)
resultadoSomaSDV = resultadoSomaSDV + resultadoMultiplicacaoSDV
}
resultadoRestoSDV = resultadoSomaSDV % 11
sdv = (resultadoRestoSDV >= 10) ? 0 : (11 — resultadoRestoSDV)
for (i = 0; i<= 9; i++){
if(cpfRecebido == cpfInvalido[i]) {
situacao = true
break
} else {
situacao = false
}
}
if (situacao) {
console.log(‘CPF inválido’)
} else {
if (cpf[9] == pdv && cpf[10] == sdv) {
console.log(“CPF válido”)
} else {
console.log(“CPF inválido”)
}
}

Diego Peres

Apaixonado pelo mundo da tecnologia! Veja algumas das minhas experiências em http://github.com/diegoperesmarques