¿Cuáles son los algoritmos en lenguaje C con ejemplos y análisis?
Algoritmos completos (C, C++)
1. Algoritmos de teoría de números
1. Encuentra el máximo común divisor de dos números
función gcd(a,b:integer):integer;
comenzar
si b=0 entonces mcd:= a
else gcd:=gcd (b,a mod b);
fin
2. Encuentra el mínimo común múltiplo de dos números
función lcm(a,b:integer):integer;
comenzar
si a
lcm:=a;
mientras que lcm mod b>0 hace inc(lcm,a);
end
3. Cómo encontrar números primos
A. Determinar si un número es primo dentro de un rango pequeño:
función prima (n: entero): booleano;
var. I: entero;
comenzar
for I:=2 to trunc(sqrt(n)) hacer
si n mod I=0 entonces comenzar p>
prime:=falso; salir;
fin;
prime:=true;
fin
B Determinar entero largo si el número en el rango es un número primo (incluyendo encontrar la tabla de números primos dentro de 50000):
procedimiento getprime;
var
i. ,j:longint;
p>
p:array:=true.
Para I:=1 to n do
Para j:= w[I] to v do F[I,j ]:=f[I-1,j-w[I]];
Optimización: el estado actual solo está relacionado con el estado de la etapa anterior y puede reducirse a una dimensión.
F[0]:=true;
Para I:=1 a n comenzar
F1:=f;
Para j:=w[I] a v hacer
Si f[j-w[I]] entonces f1[j]:=true;
F:=f1;
Fin;
B. Encuentra el valor máximo que se puede poner.
F[I,j] es el valor máximo que se puede obtener cogiendo las primeras j mochilas cuando la capacidad es I.
F [i,j] = max { f [ i – w [ j ], j-1] + p [ j ], f[ i,j-1] }
C. Encuentre el número de casos en los que está exactamente lleno.
DP:
Actualización de procedimiento;
var j,k:integer;
comenzar
c: =a;
para j:=0 a n hacer
si a[j]>0 entonces
si j+ahora<=n entonces inc( c[j+ahora],a[j]);
a:=c;
fin
2. Mochila reutilizable
A Encuentra el peso máximo que se puede meter en ella.
F[I,j] es un signo que selecciona varios elementos de los primeros i y los coloca de manera que su volumen sea exactamente j. Es de tipo booleano.
La ecuación de transición de estado es
f[I,j] = f [ I-1, j – w[I]*k ] (k=1.. j div w [ I])
B. Encuentra el valor máximo que se puede poner.
USACO 1.2 Inflación de puntaje
Realiza una competencia con un tiempo total fijo T. Hay varias preguntas opcionales. No hay límite para el número de entradas para cada pregunta. A ti (el tiempo necesario para resolver esta pregunta) y a si (la puntuación obtenida al resolver esta pregunta). Ahora necesitamos seleccionar una cantidad de preguntas para que la puntuación total obtenida se pueda maximizar al mismo tiempo que el tiempo total para resolver estas preguntas. está dentro de T. Encuentre la puntuación máxima.
*Fácil de pensar:
f[i,j] = max { f [i- k*w[j], j-1] + k*p[j ] } (0<=k<= i div w[j])
Donde f[i,j] representa el valor máximo que pueden alcanzar las primeras j mochilas cuando la capacidad es i.
*Implementación:
Comenzar
FillChar(f,SizeOf(f),0);
Para i:=1 A M Do
Para j:=1 Para N Do
Si i-problem[j].time>=0 Entonces
Comenzar
t:=problem[j].point+f[i-problem[j].time];
Si t>f[i] Entonces f[i]:=t;
Fin;
Writeln(f[M]);
Fin
C. Encuentra el número de casos en los que está exactamente lleno.
Ahoi2001 Problema 2
Encuentra el número de expresiones para la suma de números primos con números naturales esencialmente diferentes n.
La primera idea es generar la disposición de los coeficientes de cada número primo y probarlos uno por uno. Este es un método general.
procedure try(dep:integer);
var i,j:integer;
begin
cal {Este proceso calcula; El resultado del cálculo del coeficiente actual, ahora es el resultado}
si ahora>n entonces salga;
si dep=l+1 entonces comience {Generar todos los coeficientes} p>
cal;
si ahora=n entonces inc(tot);
salir;
end;
para i:=0 a n div pr[dep] comenzar
xs[dep]:=i;
try(dep+1);
xs [dep]:=0;
end;
end;
Idea 2, la búsqueda recursiva es un procedimiento más eficiente
try( dep,rest:integer);
var i,j,x:integer;
comenzar
si (rest<=0) o (dep =l +1) luego comenzar
si rest=0 entonces inc(tot);
salir;
fin;
para i: =0 para descansar div pr[dep] do
try(dep+1,rest-pr[dep]*i);
end;
{ main: try(1,n); }
Idea 3: se puede utilizar la programación dinámica para resolver el problema
Sistema monetario USACO1.2
V artículos, capacidad de la mochila Para n, encuentre el número total de formas de colocarlos.
Transferir ecuación:
Actualización de procedimiento;
var j,k:integer;
begin
c :=a;
para j:=0 a n hacer
si a[j]>0 entonces
para k:=1 a n div ahora hacer
si j+now*k<=n entonces inc(c[j+now*k],a[j]);
a:=c;
fin;
{main}
comenzar
leer(ahora); {Leer el peso del primer artículo}
i:=0; {a[i] es el número total de formas de poner cuando la capacidad de la mochila es i}
mientras i<=n comienza
a[ i]: =1; inc(i,now); end; {Defina el peso como un valor que sea un múltiplo entero del peso del primer elemento como 1, como valor inicial}
para i :=2 a v hacer
p>comenzar
leer(ahora);
actualizar {actualización dinámica}
finalizar;
writeln(a [n]);
4. Algoritmo de clasificación
A. Clasificación rápida:
procedimiento qsort(l, r:integer);
var i,j,mid:integer;
comenzar
i:=l;j:=r; mid:=a [(l+r) div 2]; {Defina el número en el medio de la secuencia actual como el número del medio}
repetir
mientras a[i] mientras a[j]>mid do dec(j);{Busca un número más pequeño que el número del medio en la mitad derecha } si i<=j entonces comienza {Si se encuentra un conjunto de pares de números que no coincide con el objetivo de clasificación, intercámbielos} swap(a[i],a [j]); inc(i); dec(j); {seguir buscando} fin; hasta i>j; if l if i end;{sort} B. Ordenación por inserción: Idea: Actualmente a[1]..a[i-1]. ] ha sido ordenado, ahora necesitamos insertar a[i] para hacer un[1].. a[i] está ordenado. procedimiento insert_sort; var i,j:integer; comenzar for i:=2 to n comenzar p> p> a[0]:=a[i]; j:=i-1; mientras a[0] a[j+1]:=a[j]; j:=j-1; fin; a [j+1]:=a[0]; end; end;{inset_sort} Clasificación de selección: clasificación de procedimiento; var i,j,k:integer; comenzar para i:=1 a n-1 hacer p> para j:=i+1 to n hacer si a[i]>a[j] entonces swap(a[i],a[j]); fin; D. Clasificación de burbujas procedimiento bubble_sort; var i,j,k:integer; comenzar para i:=1 a n-1 hacer para j:=n hasta i+1 hacer