Monday, January 30, 2006

Tarea 2

1)Diferencia de Tiempo;
#include cstdlib
#include iostream
#include stdlib.h
#include time.h
#include sys\timeb.h
using namespace std;

timeb Antes, Despues;

static void Generar(int numero)
{
FILE *Archivo;
Archivo = fopen("C:\\Codigo.txt","w");
for(int i = 0 ; i < numero ; ++i)
fprintf(Archivo,"Numeros[%i] = 0;\n",i);
}

int main(int argc, char *argv[])
{
//Generar(500000);
int Numeros[400000];
int Numeros2[400000];
ftime(&Antes);
for(int i = 0 ; i < 400000; ++i)
Numeros2[i] = 0;
ftime(&Despues);
//float differencia = (float(difftime(Despues.time,Antes.time))) + (float(abs(Despues.millitm - Antes.millitm))/1000);
float timediff = (float(difftime(Despues.time, Antes.time))) + (float(abs(Despues.millitm - Antes.millitm))/1000);
printf("Diferencia de tiempo: %.3f segundos.\n",timediff);

//Hasta aqui me decia el tiempo que tomaba el "for" que en mi caso siempre era de .000 milisegundos.

En la inicializacion por linea no me terminaba de compilar. El IDE me tira error por falta de memoria para compilar. Comoquiera el metodo de For es mucho mas comodo dado que dura mucho menos tiempo compilando. La inicializacion de linea por linea dura demasiado tiempo compilando.

No puedo comprobar mas de 400,000, el programa me da un error desconocido del sistema. Lo mas seguro es por falta de memoria tambien.

2)Analisis de Codigo; Nidia

Sub EsPrimo( ) 'Una subrutina no devuelve valor
Dim numero as Integer
Dim i as Integer
Dim Primo as Boolean
for i = 2 to numero 'numero es igual a 0, no entra en el for
if numero mod i = 0 then
primo = false
'assumiendo que entra al for, el numero que se prueba simpre va a ser primo porque N%N 'siempre es 0.
else
primo = true
end if
next
end sub

sub calcular()
dim i as integer
dim numero as integer
for i = 2 to 541 '...no se que decir
if esprimo(i) then 'sub rutina no devuelve nada, y en este caso no tiene paramentros
esprimo(i) = numero 'asumiendo que esprimo() devuelve un booleana; se esta assignado a un int
dim suma = 0 as integer 'siemre va a dar 541, como es el ultimo numero que se verifica y resetea la suma
suma = suma + numero
end if
next
end sub

P.S.
portando el codigo a mi desktop, me permite un arreglo maximo de 518904.
ya a este nivel se ve que el bucle for toma approximadamente 15 a 16 millisegundos, pero solo cuando hay una diferencia. Mayoria de las veces sale todavia 0 millisegundos de diferencia. Lo mas probable es que se tarde en stack, y por eso se nota la differencia

Sunday, January 22, 2006

Problema #1 Suma de los Primeros 100 numeros Primos
A)
//Bucle For
int resultado = 0;
int count, NumeroActual;
bool EsPrimo = true;
NumeroActual =2;
for(count=0; count<100; NumeroActual++)
{
EsPrimo = true;
for (int i = 2; i<=sqrt(NumeroActual); i++)
if (NumeroActual % i == 0)
EsPrimo=false;
if(EsPrimo)
{
resultado+= NumeroActual;
count++;
}
}
cout << resultado << endl;

B)
//Bucle While
int Resultado = 0;
int Count = 0;
int NumeroActual = 2;
int CountActual = 2;
bool NumeroPrimo = true;
while(Count < 100)
{
NumeroPrimo = true;
while((CountActual) <= sqrt(NumeroActual))
{
if(NumeroActual % CountActual == 0)
{
NumeroPrimo = false ;
}
CountActual++;
}
if(NumeroPrimo)
{
Resultado+= NumeroActual;
Count++;
}

NumeroActual++;
CountActual = 2;
}
cout << Resultado << endl;

C)
En el segundo bucle, se pueden cambiar los limites para que que llegue al numero que se esta
probando, es decir;
for (int i = 2; i<=NumeroActual; i++)

O algo mas efficiente que la anterior, solo se llega a la mitad del numero, es decir;
for (int i = 2; i <= NumeroActuall/2 ; i++)

esto es porque despues de la mitad del numero, el resultado siempre va a ser menor que 2. Porque si divides un numero por un segundo que es mas alto que la mitad del primero, siempre
va a resultar un decimal menor que 2.

D)
En mi opinion ambos bucles hacen lo mismo, solo que en el While uno tiene que hacer el incremento. El for se ve mas limpio, pero en ambos bucles se hacen las mismas operaciones, aumentos, sumatorias, validaciones, y producen el mismo resultado. La unica ventaja es que el for es mas facil de implementar, uno debe de tener en cuenta que la condicion de incremento no tiene que ser la misma que el contador.


Problema #2
Se Utiliza 2 computadoras, una de 3Ghz y la Otra a 800mhz y solo se utiliza para ordenar 1,000,000 de registros de nombres. En que condiciones el segundo equipo seria mas rapido que el primero?

Si el primer computador utiliza el Bubble Sort mal implementado, assumiendo el algoritmo no se entera cuando esta organizado, y el segundo ordenador utiliza el quicksort es casi seguro que el segundo ordenador terminara primero. El algoritmo quicksort utiliza operaciones a nivel de bit (bitwise operators)

Problema #3
int Numero1, Numero2;
cin >> Numero1;
cin >> Numero2;
if (Numero1 < Numero2)
{
int temp = Numero2;
Numero2 = Numero1;
Numero1 = temp;
}
int CopyNumero1 = Numero1;
int CopyNumero2 = Numero2;
int Condicion = 1;
while(Condicion != 0)
{
Condicion = Numero1 % Numero2;
Numero1 = Numero2;
Numero2 = Condicion;
}
cout << CopyNumero1 * CopyNumero2 / Numero1 << endl;

A) 4 formas
I-) Con el Maximo Commun Factor (MCF), Se multiplican ambos numeros y el resultado se divide entre el MCF.
II-)Se divide un de los numero entre el MCF y el resultado se multiplica por el otro numero
III)Se encuentran las portencias mas altas de los factores de los numero y se multiplican.
IV) Dado que utilizamos una computadora podemos hacer hacer un bucle que divida el contador
entre ambos numeros, el primero numero que cumple esta condicion es el minimo commun denominador

B)
Yo diria que la I o la II

C)
Porque que la III requiere mas calculos debe de ser mas lenta, y la
forma IV es simplemente absurda.