|
//Genera permutaciones de n
//Para compilar:
// cc -o permuta permuta.c
//Para ejecutar:
// ./permuta <n> [-d]
#define true (1==1)
#define false !(true)
#include <stdio.h>
#include <string.h>
void escribe(int v[],int n);
double factorial(int n);
void permutaciones(int n);
double p=0,p1=0;
int detallado=false;
void permutaciones(int n) {
//Genera las permutaciones utilizando
//el algoritmo de Kenneth H. Rosen
int i=0,j=0,temp=0;
int v[n];
int Repite=false;
for(i=0;i<n;i++){v[i]=i;} //Inicia v[]
Repite=true;
while(Repite) {
escribe(v,n);
//Halla el el mayor i tal que v[i]<v[i+1]
i=n-2;
while(v[i]>v[i+1] && i>0) i--;
if((i==0) && (v[i]>v[i+1])) //Final
{
Repite=false;
}
else
{
//Halla el menor v[j] tal que j>i y v[j]>v[i]
j=n-1;
while(v[i]>v[j]) j--;
//Intercambia v[i] y v[j]
temp=v[j];
v[j]=v[i];
v[i]=temp;
//Invierte el orden de los elementos a partir de la posición i+1
int r=n-1;
int s=i+1;
while(r>s)
{
temp=v[s];
v[s]=v[r];
v[r]=temp;
r--;
s++;
}
}
}
}
void escribe(int v[],int n) {
int i=0;
if(detallado) {
p++;
printf("%6.0f / %6.0f=%6.2f%%->",p,p1,p/p1*100.0);
}
for(i=0;i<n;i++) {
printf("%3d",v[i]);
}
printf("\n");
}
double factorial(int n) {
double f=1;
while(n>1) {
f=f*n;
n--;
}
return f;
}
int main(int argc, char **argv) {
int n=0;
char d[]="-d";
int error=false;
if (argc>3 || argc<2) {
error=true;
}
if (argc==3) {
if (strcmp(argv[2],d)==0) {
detallado=true;
} else {
error=true;
}
}
if (!error) {
n=atoi(argv[1]);
if (n<1) {
error=true;
}
}
if (!error) {
p1=factorial(n);
permutaciones(n);
} else {
printf("Uso:permuta <n> [-d]\n");
printf("n es un entero mayor que 0 .\n");
printf("-d muestra el progreso sobre el total.\n");
}
}
|
//Genera permutaciones de n
//Para compilar:
// javac permuta.java
//Para ejecutar:
// java permuta <n> [-d]
public class permuta
{
static double p=0,p1=0;
static boolean detallado=false;
static void permutaciones(int n) {
//Genera las permutaciones utilizando
//el algoritmo de Kenneth H. Rosen
int i=0,j=0,temp=0;
int v[]=new int[n];
boolean Repite=false;
for(i=0;i<n;i++){v[i]=i;} //Inicia v[]
Repite=true;
while(Repite) {
escribe(v);
//Halla el el mayor i tal que v[i]<v[i+1]
i=v.length-2;
while(v[i]>v[i+1] && i>0) i--;
if((i==0) && (v[i]>v[i+1])){ //Final
Repite=false;
} else {
//Halla el menor v[j] tal que j>i y v[j]>v[i]
j=v.length-1;
while(v[i]>v[j]) j--;
//Intercambia v[i] y v[j]
temp=v[j];
v[j]=v[i];
v[i]=temp;
//Invierte el orden de los elementos a partir de la posición i+1
int r=v.length-1;
int s=i+1;
while(r>s) {
temp=v[s];
v[s]=v[r];
v[r]=temp;
r--;
s++;
}
}
}
}
static void escribe(int v[]) {
if(detallado) {
p++;
System.out.format("%6.0f / %6.0f=%6.2f%%->",p,p1,p/p1*100.0);
}
for(int i=0;i<v.length;i++) {
System.out.format("%3d",v[i]);
}
System.out.println("");
}
static double factorial(int n) {
double f=1;
while(n>1) {
f=f*n;
n--;
}
return f;
}
public static void main(String args[]) {
int n=0;
String d="-d";
boolean error=false;
if (args.length>2) {
error=true;
}
if (args.length==2) {
if (args[1].compareTo(d)==0) {
detallado=true;
} else {
error=true;
}
}
if (!error) {
try { //Captura la excepción para comprobar que el argumento es un entero
n=Integer.valueOf(args[0]).intValue();
} catch(Exception e) {
n=0;
}
if (n<1) {
error=true;
}
}
if (!error) {
p1=factorial(n);
permutaciones(n);
} else {
System.out.println("Uso: java permuta <n> [-d]");
System.out.println("n es un entero mayor que 0 .");
System.out.println("-d muestra el progreso sobre el total.");
}
}
}
|
//Genera combinaciones de n,r
//Para compilar:
// cc -o combina combina.c
//Para ejecutar:
// ./combina <n> <r> [-d]
#define true (1==1)
#define false !(true)
#include <stdio.h>
#include <string.h>
void escribe(int v[],int r);
double factorial(int n,int m);
void combinaciones(int n,int r);
double p=0,p1=0;
int detallado=false;
void combinaciones(int n,int r) {
//Genera las combinaciones utilizando
//el algoritmo de Kenneth H. Rosen
int i=0,j=0;
int v[n];
double ci=0;
for(i=0;i<n;i++){v[i]=i;} //Inicia v[]
escribe(v,r);
ci++;
while(ci<p1) {
i = r - 1;
while (v[i] == n - r + i) {
i--;
}
v[i] = v[i] + 1;
for (j = i + 1; j < r; j++) {
v[j] = v[i] + j - i;
}
escribe(v,r);
ci++;
}
}
void escribe(int v[],int r) {
int i=0;
if(detallado) {
p++;
printf("%6.0f / %6.0f=%6.2f%%->",p,p1,p/p1*100.0);
}
for(i=0;i<r;i++) {
printf("%3d",v[i]);
}
printf("\n");
}
double factorial(int n,int m) {
//Multiplica desde n hasta m-1. n>=m
double f=1;
while(n>m) {
f=f*n;
n--;
}
return f;
}
int main(int argc, char **argv) {
int n=0,r=0;
char d[]="-d";
int error=false;
if (argc>4 || argc<3) {
error=true;
}
if (argc==4) {
if (strcmp(argv[3],d)==0) {
detallado=true;
} else {
error=true;
}
}
if (!error) {
n=atoi(argv[1]);
if (n<1) {
error=true;
}
r=atoi(argv[2]);
if (r<1 || r>n) {
error=true;
}
}
if (!error) {
//p1=factorial(n)/factorial(r)/factorial(n-r);
//Lo hace de esta forma para evitar errores de redondeo
if((n-r)>r) {
p1=factorial(n,n-r)/factorial(r,1);
} else {
p1=factorial(n,r)/factorial(n-r,1);
}
combinaciones(n,r);
} else {
printf("Uso:combina <n> <r> [-d]\n");
printf("n,r son enteros mayores que 0\n");
printf("n>=r\n");
printf("-d muestra el progreso sobre el total.\n");
}
}
|
//Genera combinaciones de n,r
//Para compilar:
// javac combina.java
//Para ejecutar:
// java combina <n> <r> [-d]
public class combina {
static double p=0,p1=0;
static boolean detallado=false;
static void combinaciones(int n,int r) {
//Genera las combinaciones utilizando
//el algoritmo de Kenneth H. Rosen
int i=0,j=0,ci=0;
int v[]=new int[n];
for(i=0;i<n;i++){v[i]=i;} //Inicia v[]
escribe(v,r);
ci++;
while(ci<p1) {
i = r - 1;
while (v[i] == n - r + i) {
i--;
}
v[i] = v[i] + 1;
for (j = i + 1; j < r; j++) {
v[j] = v[i] + j - i;
}
escribe(v,r);
ci++;
}
}
static void escribe(int v[],int r) {
if(detallado) {
p++;
System.out.format("%6.0f / %6.0f=%6.2f%%->",p,p1,p/p1*100.0);
}
for(int i=0;i<r;i++) {
System.out.format("%3d",v[i]);
}
System.out.println("");
}
static double factorial(int n,int m) {
//Multiplica desde n hasta m-1. n>=m
double f=1;
while(n>m) {
f=f*n;
n--;
}
return f;
}
public static void main(String args[]) {
int n=0,r=0;
String d="-d";
boolean error=false;
if (args.length>3) {
error=true;
}
if (args.length==3) {
if (args[2].compareTo(d)==0) {
detallado=true;
} else {
error=true;
}
}
if (!error) {
try { //Captura la excepción para comprobar que n es un entero
n=Integer.valueOf(args[0]).intValue();
} catch(Exception e) {
n=0;
}
try { //Captura la excepción para comprobar que r es un entero
r=Integer.valueOf(args[1]).intValue();
} catch(Exception e) {
r=0;
}
if (n<1 || r<1 || n<r) {
error=true;
}
}
if (!error) {
//p1=factorial(n)/factorial(r)/factorial(n-r)
//Lo hace de esta forma para evitar errores de redondeo
if((n-r)>r) {
p1=factorial(n,n-r)/factorial(r,1);
} else {
p1=factorial(n,r)/factorial(n-r,1);
}
combinaciones(n,r);
} else {
System.out.println("Uso: java combina <n> <r> [-d]");
System.out.println("n,r son enteros mayores que 0");
System.out.println("n>=r");
System.out.println("-d muestra el progreso sobre el total.");
}
}
}
|
//Calcula los dígitos de control del CCC
//Para compilar:
// cc -o ccc ccc.c
//Para ejecutar:
// ./ccc <n>
#define true (1==1)
#define false !(true)
#include <stdio.h>
#include <string.h>
void escribe(char c);
char digitoControl(char n[]);
char digitoControl (char n[]) {
int peso[]={6,3,7,9,10,5,8,4,2,1};
int i=0,suma=0,digito = 0;
for (i = strlen(n)-1; i>=0; i--) {
suma = suma + (n[i]-'0') * peso[strlen(n)-i-1];
}
digito = 11 - (suma % 11);
if(digito == 10) digito = 1;
if(digito == 11) digito = 0;
return (char)(digito+'0');
}
void escribe(char c) {
printf("%c\n",c);
}
int main(int argc, char **argv) {
int error=false,i=0;
char p1[9],p2[11];
p1[8]='\0';p2[10]='\0';
if (argc!=2) {
error=true;
}
if (!error) {
if (strlen(argv[1])!=18) { //Comprueba que la longitud de la cadena es 18
error=true;
}
//Comprueba que son dígitos
for (i=0;i<strlen(argv[1]);i++) {
if (argv[1][i]<'0' || argv[1][i]>'9') {
error=true;
}
}
}
if (!error) {
//Monta p1[] y p2[]
for (i=0;i<8;i++) p1[i]=argv[1][i];
for (i=0;i<10;i++) p2[i]=argv[1][i+8];
escribe(digitoControl(p1)); //Bloque Banco+Sucursal
escribe(digitoControl(p2)); //Cuenta
} else {
printf("Uso: ./ccc <n> \n");
printf("n es la secuencia: Banco(4n)+Sucursal(4n)+Cuenta(10n)\n");
printf("El sistema devuelve el dígito de control de 'Banco'+'Sucursal' y el de 'Cuenta'.\n");
printf("Por ejemplo: para n=123412341234567890 el sistema devuelve 1 y 6\n");
}
}
|
//Calcula los dígitos de control del CCC
//Para compilar:
// javac ccc.java
//Para ejecutar:
// java ccc <n>
public class ccc
{
static char digitoControl(char[] n) {
int peso[]={6,3,7,9,10,5,8,4,2,1};
int suma=0,digito = 0;
for (int i = n.length-1;i>=0;i--) {
suma = suma + (n[i]-'0') * peso[(n.length)-i-1];
}
digito = 11 - (suma % 11);
if(digito == 10) digito = 1;
if(digito == 11) digito = 0;
return (char)(digito+'0');
}
static void escribe(char c) {
System.out.println(c);
}
public static void main(String args[]) {
boolean error=false;
if (args.length!=1) {
error=true;
}
if (!error) {
if (args[0].length()!=18) { //Comprueba que la longitud de la cadena es 18
error=true;
}
//Comprueba que son dígitos
char[] digitos=args[0].toCharArray();
for (int i=0;i<args[0].length();i++) {
if (digitos[i]<'0' || digitos[i]>'9') {
error=true;
}
}
}
if (!error) {
escribe(digitoControl(args[0].substring(0,8).toCharArray())); //Bloque Banco+Sucursal
escribe(digitoControl(args[0].substring(8,18).toCharArray())); //Cuenta
} else {
System.out.println("Uso: java ccc <n> ");
System.out.println("n es la secuencia: Banco(4n)+Sucursal(4n)+Cuenta(10n)");
System.out.println("El sistema devuelve el dígito de control de 'Banco'+'Sucursal' y el de 'Cuenta'.");
System.out.println("Por ejemplo: para n=123412341234567890 el sistema devuelve 1 y 6");
}
}
}
|
//Calcula la letra del NIF
//Para compilar:
// cc -o nif nif.c
//Para ejecutar:
// ./nif <n>
#define true (1==1)
#define false !(true)
#include <stdio.h>
#include <string.h>
void escribe(char c);
char letraNif(int n);
char letraNif (int n) {
char letra[]="TRWAGMYFPDXBNJZSQVHLCKE";
return letra[n%23];
}
void escribe(char c) {
printf("%c\n",c);
}
int main(int argc, char **argv) {
int error=false,i=0;
if (argc!=2) {
error=true;
}
if (!error) {
if (strlen(argv[1])!=8) { //Comprueba que la longitud de la cadena es 8
error=true;
}
//Comprueba que son dígitos
for (i=0;i<strlen(argv[1]);i++) {
if (argv[1][i]<'0' || argv[1][i]>'9') {
error=true;
}
}
}
if (!error) {
escribe(letraNif(atoi(argv[1]))); //Letra
} else {
printf("Uso: ./nif <n> \n");
printf("n son los 8 dígitos del DNI.\n");
printf("El sistema devuelve la letra que completa el NIF.\n");
printf("Por ejemplo: para n=12345678 el sistema devuelve la letra Z\n");
}
}
|
//Calcula la letra del NIF
//Para compilar:
// javac nif.java
//Para ejecutar:
// java nif <n>
public class nif
{
static char letraNif(int n) {
String letra="TRWAGMYFPDXBNJZSQVHLCKE";
return letra.charAt(n % 23);
}
static void escribe(char c) {
System.out.println(c);
}
public static void main(String args[]) {
boolean error=false;
if (args.length!=1) {
error=true;
}
if (!error) {
if (args[0].length()!=8) { //Comprueba que la longitud de la cadena es 8
error=true;
}
//Comprueba que son dígitos
char[] digitos=args[0].toCharArray();
for (int i=0;i<args[0].length();i++) {
if (digitos[i]<'0' || digitos[i]>'9') {
error=true;
}
}
}
if (!error) {
escribe(letraNif(Integer.valueOf(args[0].substring(0,8)).intValue())); //Letra
} else {
System.out.println("Uso: java nif <n> ");
System.out.println("n son los 8 dígitos del DNI.");
System.out.println("El sistema devuelve la letra que completa el NIF.");
System.out.println("Por ejemplo: para n=12345678 el sistema devuelve la letra Z");
}
}
}
|