All pastes #1912606 Raw Edit

Mine

public text v1 · immutable
#1912606 ·published 2010-08-07 02:19 UTC
rendered paste body
#include <stdio.h>
#include <math.h>
#include <stdint.h>

#define LIMIT 650000

//Sumo los exponentes+1 de la factorizacin

int primosmenores(unsigned long int numero, unsigned long int primos[], int minimo);
int esprimo(unsigned long int numero);
void factorizar(unsigned long int numero, unsigned long int factores[], unsigned long int primos[], int limite);

void main()
{
	int cantdivisores, nuevacantprimos, cantprimos;
	unsigned long int numero, factores[LIMIT], primos[LIMIT], i, ii;

	for (i = 0; i < LIMIT; i++)
	{
		factores[i] = 0;
		primos[i] = 0;
//		printf("%d\n", i);
	}

	numero = 0;
	primos[0] = 2;
	cantprimos = 1;

	for (i = 1; cantdivisores != 500; i++)
	{
		for (ii = 0; ii < LIMIT; ii++)
		{
			factores[ii] = 0;
		}

		numero += i; //Primero calculo el numero
		cantprimos = primosmenores(numero,primos,cantprimos); // Calculo los primos menores
//		printf("\n%lld es el numero triangulo (n %lld) y tiene %d primos menores.\n", numero, i, cantprimos);
		factorizar(numero,factores,primos,cantprimos); //Factorizo al numero con los primos que lo conforman

		cantdivisores = 1;

		for (ii = 0; ii < cantprimos; ii++)
		{
			while ((factores[ii] == 0) && (ii < cantprimos))
			{
				ii++;
			}
//			printf("El factor numero %d es %ld.\n", i, factores[i]);

 			cantdivisores = cantdivisores*(factores[ii]+1);
		}

		printf("\n%ld es el numero triangulo (n %ld) y tiene %d divisores y %d primos menores.\n", numero, i, cantdivisores, cantprimos);

//		printf("El numero %d tiene %d divisores.\n", numero,cantdivisores);

	}

/*	for (i = 0; i < cantprimos; i++)
	{
		printf("%d es primo.\n", primos[i]);
	}
*/}

int primosmenores(unsigned long int numero, unsigned long int primos[], int minimo)
{
	int i, ii;

	for ((i = primos[minimo-1]+1) && (ii = minimo); i <= numero; i++)
	{
		if (esprimo(i) == 1)
		{
			primos[ii] = i;
			ii++;
//			printf("%d es primo.\n", i);
		}
	}

	return ii;
}

int esprimo(unsigned long int numero)
{
	int r,f;

        if (numero == 1)
        {
                return 0;
        }
        else if (numero < 4)
        {
                return 1;
        }
        else if ((numero % 2) == 0)
        {
                return 0;
        }
        else if (numero < 9)
        {
                return 1;
        }
        else if ((numero % 3) == 0)
        {
                return 0;
        }
        else
        {
                r = floor(sqrt(numero));
                f = 5;

                while (f <= r)
                {
                        if ((numero % f) == 0)
                        {
                                return 0;
                        }
                        if ((numero % (f+2) == 0))
                        {
                                return 0;
                        }

                        f += 6;
                }

                return 1;
        }
}

void factorizar(unsigned long int numero, unsigned long int factores[], unsigned long int primos[], int limite)
{

        int i;

        for (i = 0; i < limite; ++i)
        {
//              printf("We're in!\n");
                while ((numero != 1) && ((numero % primos[i]) == 0))
                { 
//                      printf("Estamos en el while con %d y %d\n",primes[i],numero);
                        numero = numero / primos[i];
//                      printf("Numero ahora vale %d\n",numero);
                        factores[i] += 1;
                }
//              printf("Salimos del while!\n");
        }

/*	for (i = 0; i < limite; ++i)
	{
		printf("%ld ", factores[i]);
	}
*/
}