Está cheio de exemplos por aí de como verificar se o dígito de um CPF é válido, mas é mais raro achar algum exemplo de implementação de um algoritmo para verificar a validade do dígito do RG. Aqui vamos explicar esse simples algoritmo e implementá-lo em C, podendo ser facilmente convertido para qualquer linguagem.
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int rg_valido(char *rg)
{
char r[9];
int i=0,j=0;
/* O RG tem 9 números, e o que fazemos na primeira etapa é pegar só os
números (caso o cara tenha digitado os pontos e os traços do RG, eles
são ignorados). Ao mesmo tempo em que pegamos os números, convertemos
os valores de texto para valores numéricos, que são guardados no
vetor r. */
for(;i<strlen(rg)&&j<9;i++)
if(isdigit(rg[i]))
r[j++] = rg[i] - '0';
/* Agora fazemos a checagem. Multiplicamos o primeiro número do RG por 2,
o segundo por 3, e assim por diante, e vamos somando os resultados.
O dígito (último número) é multiplicado por 100 e também é somado.
Depois verificamos se a soma é divisível por 11. Se for, o RG é
válido. */
return (r[0]*2 + r[1]*3 + r[2]*4 + r[3]*5 +
r[4]*6 + r[5]*7 + r[6]*8 + r[7]*9 +
r[8]*100) % 11 == 0;
}
int main(int argc, char **argv)
{
printf("RG %s\n", rg_valido
(argv
[1])?
"válido":
"inválido");
return 0;
}