Ejercicios Básicos

Iniciado por Myth.ck, 14 Mayo 2009, 03:41 AM

0 Miembros y 2 Visitantes están viendo este tema.

ghastlyX

Este código no es muy eficiente...

Sabemos que un número tiene un número impar de divisores si y sólo si es un cuadrado perfecto.

En vez de ir número a número y ver si es un cuadrado, es más fácil directamente coger los k primeros números y mostrar sus cuadrados. Como yo digo haces k iteraciones, como tú haces estás mirando hasta el último de los cuadrados perfectos, es decir, k2 iteraciones.

Un saludo de ghastlyX ;)

Myth.ck

Mmm es algo parecido claro a lo que hice, pero tu te refieres a lo siguiente?:

Código (cpp) [Seleccionar]
For(i=0;i<=K;i++)
{
   x=i^2;//En c++ no es i^2 pero basta con agregar una función
   cout<<x<<";"<<endl;
}
Un intelectual es un hombre que usa más palabras de las necesarias para decir más cosas de las que sabe.

ghastlyX

Sí, así te ahorras tener que pasar por cada uno de los cuadrados. Habría que decidir si el cero es o no es cuadrado perfecto. Si lo consideras cuadrado perfecto, sería el bucle hasta K - 1 incluído, si no empezaría en 1 y sería hasta K.

Un saludo de ghastlyX ;)

Myth.ck

Tienes razón... Muchas gracias :)
Un intelectual es un hombre que usa más palabras de las necesarias para decir más cosas de las que sabe.

Eliptico

Buenas!!!!!!

Solo quiero dejar una pequeña explicacion sobre el primer y el segundo problema:

1º) Si bucamos don numeros naturales consecutivos cuya diferencia se k se tendra que

k=(n+1)!  - n! = (n+1)*n! - n! = ( (n+1) - 1) * n! = n*n!

Es decir, existira n natural cumpliendo (n+1)! - n! = k si y solo si k=n*n!

es decir, si existe un natural n tal que k=n*n! entonces existen el A=n y el B=(n+1) que se buscan, si no no.

2º)
sea N={n naturales| k>=n!}

N es un conjunto de naturales acotado superiormente por k, por lo tanto tendra un maximo m cumpliendo que m! <= k.

(m+1) no puede estar en N, ya que si estubiese seria m! < (m+1)! <= k, lo cual seria contrdictorio con que m fuese maximo.

Por lo tanto (m+1) no pertenece a N y (m+1) no puede cumplir la condicion (m+1)!<=k luego (m+1)! > k

Es decir. 2 soluciona cuando se encuentra el primer n natural tal que n!>k, y en este caso se tendra que A=(n-1) y B=n.

Bueno, como el intervalo es cerrado por ambos lados, si (n-1)! = k  se tendra que [(n-2)! , (n-1)!] tambien cumplen las condiciones del problema
(A=(n-2) , B=(n-1)).

Ahora los dos problemas son mas faciles, ¿No?

Un saludo!!!!!!!!!

Eliptico

Huy, vaya rayada con el primer problema. jejejeje. Lo he entendido y mal y lo he puesto patas arriba.   :-[

A ver si lo corrijo qu la solucion no es tan matematica   :silbar:

Eliptico

Ahi va la solucion:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc,char* argv[])
{
    unsigned long fact1=1,fact2=1,i=1;
    char num1[50],num2[50];
    int difCifras; /*no creo que un unsigned long tenga tantas cifras :P*/

    do{
        printf("Introduce la diferencia de cifras entre dos factoriales consecutivos: ");
        fflush(stdin);
        scanf("%d",&difCifras);
    }while(difCifras<0);

    do{
        fact1*=i;
        fact2=fact1*(i+1);

        sprintf(num1,"%lu",fact1);
        sprintf(num2,"%lu",fact2);

        i++;
        if(i==13) /*13! excede la capacidad de un usigned long*/
            break;
    }while(strlen(num2)-strlen(num1) < difCifras);

    i--;

    if(i!=12)
        printf("%d! y %d! se diferencian en %d cifras\n"
        "%d!=%lu\n"
        "%d!=%lu\n",i,i+1,difCifras,i,fact1,i+1,fact2);
    else
        printf("No se dispone de tanta capacidad de calculo.\n");
    system("PAUSE");

    return 0;
}


Espero que sirva de algo!!

Un saludo!!!!!