Primero en palabras.
ALGORITMO 1
1. Multiplicar cada dígito del RUT se por 2, 3, ..., 7, 2, 3, ... de atrás hacia adelante.
2. Sumar las multiplicaciones parciales.
3. Calcular el resto de la división por 11
4. El Dígito Verificador es 11 menos el resultado anterior. Si es 10, se cambia por 'k'.
EJEMPLO. RUT: 11.222.333
1. 1 1 2 2 2 3 3 3 <-- RUT
* 3 2 7 6 5 4 3 2 <-- 2, 3, 4, 5, 6, 7, 2, 3, ...
--------------------------------------
3 2 14 12 10 12 9 6
2. SUMA: 3 + 2 + 14 + 12 + 10 + 12 + 9 + 6 = 68
3. 68 : 11 = 6
- 66
----
2 <-- RESTO
4. 11 - 2 = 9 <-- DÍGITO VERIFICADOR
__________________________________________________ ____
ALGORITMO 2, versión alternativa
1. Multiplicar cada dígito del RUT se por 9, 8, ..., 4, 9, 8, ... de atrás hacia adelante.
2. Sumar las multiplicaciones parciales.
3. Calcular el resto de la división por 11
4. El Dígito Verificador es el resultado anterior. Si es 10, se cambia por 'k'.
EJEMPLO. RUT: 11.222.333
1. 1 1 2 2 2 3 3 3 <-- RUT
* 8 9 4 5 6 7 8 9 <-- 9, 8, 7, 6, 5, 4, 9, 8, ...
--------------------------------------
8 9 8 10 12 21 24 27
2. SUMA: 8 + 9 + 8 + 10 + 12 + 21 + 24 + 27 = 119
3. 119 : 11 = 10
- 110
-----
9 <-- RESTO
4. 9 <-- DÍGITO VERIFICADOR
__________________________________________________ ____
ALGORITMO 3, propiedades de la división por 11
1. Multiplicar cada dígito del RUT se por 9, 8, ..., 4, 9, 8, ... de atrás hacia adelante.
2. Sumar las multiplicaciones parciales.
3. Suma alternada de la lista reversa de los dígitos del resultado anterior.
4. El Dígito Verificador es el resultado anterior. Si es 10, se cambia por 'k'.
EJEMPLO. RUT: 11.222.333
1. 1 1 2 2 2 3 3 3 <-- RUT
* 8 9 4 5 6 7 8 9 <-- 9, 8, 7, 6, 5, 4, 9, 8, ...
--------------------------------------
8 9 8 10 12 21 24 27
2. SUMA: 8 + 9 + 8 + 10 + 12 + 21 + 24 + 27 = 119
3. SUMA ALTERNADA: 119 -> 9 - 1 + 1 = 9
4. 9 <-- DÍGITO VERIFICADOR
ActionScript, Flash
El código devuelve un true o false solamente, el que la persona que diseñe tiene que asignar la función que quiera. Usa dos campos de textos de input; uno de la pate numerica con la variable "xRut" y otro con el campo del dígito verificador "Dv". Este código va directamente en el boton de "aceptar" en el formulario en cuestión
on (release){
// Definicion de Variables Utilizadas
var Suma = 0;
var rut = xRut;
var NumMag = 2;
var Resto = 0;
// Defino el arreglo con los posibles digitos verificadores
var DigVer = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "K", "0"

;
var ParteNumerica = new Array();
// Valida que el rut no este vacio
if (rut.length == 0) { return false; }
// Copio solo la parte numerica, sin espacios ni puntos
// en otra variable para calcular el digito verificador
for (j=0, i=0; j<rut.length; j++)
{
if (rut.charAt(j) != ' ' && rut.charAt(j) != '.' && rut.charAt(j) != '-'

{
ParteNumerica[i] = rut.charAt(j);
++i;
}
}
// Se calcula el digito verificador del rut
for (i=ParteNumerica.length-1; i>=0; i--, NumMag++)
{
Suma += ParteNumerica[i]*NumMag;
trace(Suma +' '+ ParteNumerica[i] +' '+ NumMag);
if (NumMag>6) { NumMag = 1; }
}
Resto = 11-(Suma%11);
if (DigVer[Resto] != Dv.toUpperCase())
{
trace("Rut válido"

;
}
else
{
trace("Rut no válido"

;
}
}
ASP
Function codigo_veri(rut)
tur=strreverse(rut)
mult = 2
for i = 1 to len(tur)
if mult > 7 then mult = 2 end if
suma = mult * mid(tur,i,1) + suma
mult = mult +1
next
valor = 11 - (suma mod 11)
if valor = 11 then
codigo_veri = "0"
elseif valor = 10 then
codigo_veri = "k"
else
codigo_veri = valor
end if
end function
C
main(){
int T,M=0,S=1;
scanf("%d",&T);
for(;T;T/=10)S=(S+T%10*(9-M++%6))%11;
printf("%c\n",S?S+47:75);
}
C Sharp C#
private string digitoVerificador(int rut)
{
int Digito;
int Contador;
int Multiplo;
int Acumulador;
string RutDigito;
Contador = 2;
Acumulador = 0;
while (rut != 0)
{
Multiplo = (rut % 10) * Contador;
Acumulador = Acumulador + Multiplo;
rut = rut/10;
Contador = Contador + 1;
if (Contador ==

{
Contador = 2;
}
}
Digito = 11 - (Acumulador % 11);
RutDigito = Digito.ToString().Trim();
if (Digito == 10 )
{
RutDigito = "K";
}
if (Digito == 11)
{
RutDigito = "0";
}
return (RutDigito);
}
}
Clipper
FUNCTION validarut(rut)
Local ext:=SUBSTR(rut,12,1)
local x:=0
local divisor:={3,2,7,6,5,4,3,2}
Local suma:=0
local vuelta := .F.
rut:=SUBSTR(rut,1,2)+SUBSTR(rut,4,3)+SUBSTR(rut,8, 3)
if ext == "k"
ext:= "K"
endif
FOR x := 1 TO 8
suma += VAL(SUBSTR(rut,x,1))* divisor [x]
NEXT
suma := 11 - suma%11
if (suma == 10 .and. ext == "K"

.OR. (suma == 11 .and. ext == "0"

vuelta=.T.
elseif suma == VAL(ext)
vuelta=.T.
endif
if vuelta==.T.
tone(7800,2)
else
tone(1800,2)
endif
RETURN (vuelta)
COBOL
rutdig.
move spaces to ctrl
display nada line 10 position 57
accept rut-aux no beep
line 10 position 57
inspect rut-aux replacing leading " " by "0"
if numerostr is numeric and guion = "-"
move 0 to suma
move 2 to numerador
perform varying puntero-vector from 8 by -1
until puntero-vector = 0
compute suma = suma +
numeroval(puntero-vector) * numerador
add 1 to numerador
if numerador = 8 move 2 to numerador end-if
end-perform
divide suma by 11 giving entero remainder resto
compute dig = 11 - resto
if dig = 10
move "k" to digi2
else
if dig = 11
move "0" to digi2
end-if
end-if
if digito = "k"
move "k" to digito
end-if
if digito not = digi2
display spaces
line 10 position 57
display spaces line 10 position 60
display "digito no corresponde"
line 10 position 57 blink
accept nulo
display nada line 10 position 57
else
move rut-aux to rut-w
move "e" to ctrl
end-if
else
display spaces
line 10 position 57
display spaces line 10 position 62
display "Rut mal ingresado!!"
line 10 position 57 blink
accept nulo
display nada
line 10 position 57
end-if.
Delphi
Function ValRut(Rut: String):String;
var
Cuenta, Suma, totalrut, Revisa : Integer;
begin
Suma:=2;
TotalRut:=0;
For Cuenta:=Length(Trim(rut)) downto 1 do
begin
if Suma>7 then Suma:=2;
Totalrut:=Totalrut+((StrToInt(copy(rut,cuenta,1))) *suma);
Suma:=Suma+1;
end;
Revisa:=Round((frac(Totalrut/11)*10)+0.5);
Revisa:=11-revisa;
If Revisa=10 then Result:='K'
else
begin
If Revisa=11 then Result:='0'
else Result:=IntToStr(Revisa);
end;
end;
Excel
Function dv(a)
j = 2
For i = 0 To Len(a) - 1
aux = aux + Val(Mid$(a, Len(a) - i, 1)) * j
If j > 6 Then
j = 2
Else
j = j + 1
End If
Next i
aux1 = 11 - (aux Mod 11)
If aux1 < 10 Then
dv = aux1
Else
dv = "K"
End If
End Function
Java
class v{ public static void main(String args[]){int M=0,S=1,T=
Integer.parseInt(args[0]);for(;T!=0;T/=10)S=(S+T%10*(9-M++%6))%11;
System.out.println((char)(S!=0?S+47:75));}}
JavaScript
function dv(T){var M=0,S=1;for(;T;T=Math.floor(T/10))
S=(S+T%10*(9-M++%6))%11;return S?S-1:'k';}
Pascal
Program DigitoVerificador;
Uses Crt;
Var s, d: String;
elFactor, i, a, digito, dummy: Integer;
PROCEDURE Input(mensaje: String; VAR numero: String);
VAR s: String; ch: Char;
ready: Boolean;
BEGIN
s:='';
ready:=FALSE;
Write(mensaje);
REPEAT
ch:=ReadKey;
CASE ch OF
'0': IF s='' THEN BEGIN
s:=ch;
Write(ch);
END ELSE IF (s<>'0'

THEN BEGIN
s:=Concat(s,ch);
Write(ch);
END;
'1'..'9': IF (s='0'

THEN BEGIN
s:=ch;
Write(#8, s);
END ELSE BEGIN
s:=Concat(s,ch);
Write(ch);
END;
#8: IF s<>'' THEN BEGIN { backspace elimina el último }
s:=Copy(s,1,Length(s)-1); { caracter del string
(siempre }
Write(#8,' ',#

; { que éste no sea vacío) }
END;
#13: IF (s=''

THEN Write(#7) ELSE ready:=TRUE;
{ ENTER: listo para transformar a }
{ número, pero no acepta uno nulo }
ELSE ; { no hacer caso a ninguna otra tecla }
END; {case}
UNTIL ready;
Writeln;
numero:=s; { retornar el valor ingresado }
END;
FUNCTION Factor: Integer;
BEGIN
if ((elFactor<2) or (elFactor>7)) THEN BEGIN
writeln('ERROR EN LA EJECUCION DEL PROGRAMA - MEJOR ABORTO.'

;
Halt(1);
END ELSE BEGIN
elFactor:=elFactor+1;
IF (elFactor=

THEN elFactor:=2;
END;
Factor:=elFactor;
END;
BEGIN
Writeln('Para finalizar, ingrese el RUT 0'

;
Writeln;
REPEAT
elFactor:=7; a:=0;
Input('Ingrese el RUT sin guión ni dígito verificador :', s);
FOR i:=Length(s) DOWNTO 1 DO BEGIN
d:=Copy(s,i,1);
Val(d,digito,dummy);
a:=a+digito*Factor;
END;
a:=11-(a MOD 11); IF (a=11) THEN a:=0;
write('El RUT ingresado es: ', s, '. El dígito verificador es: '

;
IF (a<>10) THEN writeln(a) ELSE writeln('K'

;
writeln;
UNTIL (s='0'

;
END.
Perl
sub dv{$_=pop;$r+=$&*(9-$c++%6)while s/\d$//;$r%11>9?k:$r%11;}
PHP
<?php
function dv($r){$s=1;for($m=0;$r!=0;$r/=10)$s=($s+$r%10*(9-$m++%6))%11;
return chr($s?$s+47:75);}
?>
PostgreSQL
CREATE OR REPLACE FUNCTION digito_verificador(varchar)
RETURNS char AS '
DECLARE
rut ALIAS FOR $1;
rut_cero varchar(

;
valor int;
BEGIN
valor := 0;
rut_cero := lpad(rut,8,''0''

;
valor := valor + (substring(rut_cero,8,1)::int

*2;
valor := valor + (substring(rut_cero,7,1)::int

*3;
valor := valor + (substring(rut_cero,6,1)::int

*4;
valor := valor + (substring(rut_cero,5,1)::int

*5;
valor := valor + (substring(rut_cero,4,1)::int

*6;
valor := valor + (substring(rut_cero,3,1)::int

*7;
valor := valor + (substring(rut_cero,2,1)::int

*2;
valor := valor + (substring(rut_cero,1,1)::int

*3;
valor := valor % 11;
IF valor =1 THEN
RETURN ''K'';
END IF;
IF valor =0 THEN
RETURN ''0'';
END IF;
IF valor>1 AND valor<11 THEN
RETURN (11-valor)::char;
END IF;
END
' LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION valida_rut(varchar(9))
RETURNS bool AS '
DECLARE
rutfull ALIAS FOR $1;
rutfull_cero varchar(9);
rut varchar(

;
dv char;
BEGIN
IF rutfull IS NULL THEN
RETURN TRUE;
END IF;
rutfull_cero := lpad(rutfull,9,''0''

;
rut:= substr(rutfull_cero,0,9);
dv := substr(rutfull_cero,9,1);
IF digito_verificador(rut)=upper(dv) THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END
' LANGUAGE plpgsql;
Visual Basic
Public Function RutDigito(ByVal Rut As Long) As String
Dim Digito As Integer
Dim Contador As Integer
Dim Multiplo As Integer
Dim Acumulador As Integer
Contador = 2
Acumulador = 0
While Rut <> 0
Multiplo = (Rut Mod 10) * Contador
Acumulador = Acumulador + Multiplo
Rut = Rut \ 10
Contador = Contador + 1
If Contador = 8 Then
Contador = 2
End If
Wend
Digito = 11 - (Acumulador Mod 11)
RutDigito = CStr(Digito)
If Digito = 10 Then RutDigito = "K"
If Digito = 11 Then RutDigito = "0"
End Function
Visual FoxPro
FUNCTION Val_Rut
PARAMETERS rut,digver
STORE 0 TO suma
STORE 2 TO j
Largo = LEN(rut)
FOR i = Largo TO 1 STEP -1
Dig = VAL(SUBSTR(rut,i,1))
suma = suma + (Dig * j)
IF j = 7
j = 1
ENDIF
j = j + 1
ENDFOR
RESTO = MOD(suma,11)
DO CASE
CASE RESTO = 0
dv = 0
CASE RESTO = 1
dv = "K"
IF digver = "k" OR digver = "K"
* WAIT 'RUT INCORRECTO!!!' WINDOWS
RETURN .F.
ENDIF
RETURN .T.
OTHERWISE
dv = 11 - RESTO
ENDCASE
IF digver == ALLTRIM(STR(dv))
RETURN .T.
ELSE
* WAIT 'RUT INCORRECTO!!!' WINDOWS
RETURN .F.
ENDIF
ENDFUNC