jueves, 30 de septiembre de 2010

Calcular factores primos de un numero

0

Este programa es variación de Saber si un numero es primo y Calculando números primos y como dice en el titulo se encarga de calcular los factores primos de un numero. Por razones desconocidas falla algunas veces, no con determinados números sino de forma aleatoria, todavia no se que es lo que lo causa.

#include <iostream>
#include <math.h>

using namespace std;

int main()
{
start:
    cout << endl << endl;
    unsigned int x,a, i = 3, j, n = 2, d,max;
    unsigned int * p = new unsigned int[x/3];
    p[0] = 2;
    p[1] = 3;

    cin >> x;
    cin.clear();
    if (x < 2)
    {
        cout << x << " no es mayor que 1." << endl;
        goto start;
    }

top:
    while (x>1)
    {
        for (a=0; a<n; a++)
        {
            if (x%p[a]==0)
            {
                x/=p[a];
                cout << p[a] << ", ";
                goto top;
            }
        }

        max = int(sqrt(x));
        while (i < max)
        {
            d = int(sqrt(i+=2));
            j = 1;
            while (d >= p[j] && i%p[j]) j++;
            if (d < p[j])
            {
                p[n++] = i;
                if (x%i == 0)
                {
                    cout << i << ", ";
                    x/=i;
                    goto top;
                }
            }
        }
        cout << x << ".";
        break;
    }
    delete [] p;
    goto start;
};

Comparte o puntua esta publicación ▼

jueves, 23 de septiembre de 2010

Saber si un numero es primo : C

0

Hace unos meses publiqué el código de un programa que calculaba muy rápido todos los números primos desde cero a un numero dado.[IR]

Hoy pongo otro parecido, basado en el anterior pero que calcula y dice si un numero es primo o no.

#include <iostream>
#include <math.h>

using namespace std;

int main()
{
top:

    unsigned int x, i = 3, j, n = 2, d,max;
    cin >> x;
    cin.clear();

    if (x < 2)
        cout << x << " no es mayor que 1." << endl;
    else if (x < 4)
        cout << x << " es primo." << endl;
    else if (x%2 == 0)
        cout << x << " no es primo." << "  Es divisible por 2" << endl;
    else if (x%3 == 0)
        cout << x << " no es primo." << "  Es divisible por 3" << endl;
    else
    {
        int * p = new int[x/3];
        max = int(sqrt(x));
        p[0] = 2;
        p[1] = 3;

        while (i < max)
        {
            d = int(sqrt(i+=2));
            j = 1;
            while (d >= p[j] && i%p[j]) j++;
            if (d < p[j])
            {
                p[n++] = i;
                if (x%i == 0)
                {
                    cout << x << " no es primo." <<endl<< "  Es divisible por " << i << endl;
                    goto top;
                }
            }
        };
        cout << x << " es primo" << endl;
    }
    cout << endl;
    goto top;
};

Comparte o puntua esta publicación ▼

sábado, 18 de septiembre de 2010

Generar imagen de un archivo de música

0

Hoy voy a mostrar el código fuente de un programa que hice y que, como se ve en la imagen de abajo, genera una imagen a partir de un archivo de música.

El programa no es de mas de 80 lineas, y usa la librería "Bass" para leer los archivos de música y "easyBMP" para generar la imagen.

Seguramente muchos estaréis pensando que bmp es peor que, por ejemplo,  png o jpg, pero aunque ocupe mas es el mas fácil y simple. Por otro lado, el programa esta sin optimizar, y seguramente tenga algunos pequeños fallos.

Descargar

#include "bass.h"
#include "EasyBMP.h"
using namespace std;

#define WIDTH 1520
#define HEIGHT 150

int main(int argc, char* file[])
{
    if (argc < 2)
        cout << "Usage Music2bmp file1.mp3 ... fileX.ext" << endl;
    else if (HIWORD(BASS_GetVersion())!=BASSVERSION)
        cout << "An incorrect version of BASS.DLL was loaded" << endl;
    else if (!BASS_Init(-1,44100,0,0,NULL))
        cout << "Can't initialize device" << endl;
    else
    {
        for (int z=1; z<argc; z++)
        {
            cout << "      "<< file[z];

            DWORD chan;
            if (!(chan = BASS_StreamCreateFile(FALSE,file[z],0,0,BASS_STREAM_DECODE)) &&
                    !(chan = BASS_MusicLoad(FALSE,file[z],0,0,BASS_MUSIC_DECODE,0)))
            {
                cout << '\r' << "ERROR " << endl; //load error
                continue;
            }

            BMP img;
            img.SetSize(WIDTH,HEIGHT);
            img.SetBitDepth(24);

            DWORD bpp = BASS_ChannelGetLength(chan,BASS_POS_BYTE)/WIDTH;
            DWORD cpos=0, peak[2]= {0}, n=0, pos=0, level;

            do
            {
                level = BASS_ChannelGetLevel(chan);
                n++;
                peak[0] = (peak[0]*(n-1)+LOWORD(level))/n;
                peak[1] = (peak[1]*(n-1)+HIWORD(level))/n;
                pos = BASS_ChannelGetPosition(chan,BASS_POS_BYTE)/bpp;
                if (pos>cpos)
                {
                    for (DWORD a=0,b=peak[0]*(HEIGHT/2)/32768; a<b; a++)
                    {
                        img(cpos, HEIGHT/2-a-1)->Red = (BYTE) (a+b);
                        img(cpos, HEIGHT/2-a-1)->Green = (BYTE) (a*1.75+b*1.25);
                        img(cpos, HEIGHT/2-a-1)->Blue = (BYTE) (a*2.5+b);
                    }
                    for (DWORD a=0,c=peak[1]*(HEIGHT/2)/32768; a<c; a++)
                    {
                        img(cpos, HEIGHT/2+a)->Red = (BYTE) (a+c*1.25);
                        img(cpos, HEIGHT/2+a)->Green = (BYTE) (a*1.75+c);
                        img(cpos, HEIGHT/2+a)->Blue = (BYTE) (a*2.5+c);
                    }
                    cout << '\r' << (pos*100)/WIDTH << '%';
                    cpos = pos;
                    peak[0]=peak[1]=n=0;

                }
            }
            while (pos<WIDTH);
            BASS_StreamFree(chan);
            Rescale(img,'W',WIDTH/2);

            char * out = new char[strlen(file[z])+4];
            strcpy(out,file[z]);
            strcat (out,".bmp");
            img.WriteToFile(out);
            delete [] out;
            cout << '\r' << "OK    " << endl;
        }
        BASS_Free();
    }
    system("pause");
    return 0;
}

Comparte o puntua esta publicación ▼

viernes, 3 de septiembre de 2010

1Kb JavaScript Calendar

0

Otro proyecto más terminado, se trata de un calendario JavaScript, en concreto es una única función que genera un calendario, con la posivilidad de cambiar el primer dia de la semana, ya que en algunos paises acostumbran a empezar por el domingo, también dispone de dos botones para cambiar de mes, se puede cambiar el idioma, y todo esto en tan solo un kilobyte.

Ver / Descargar Ver código fuente

Comparte o puntua esta publicación ▼