//---------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int LastFermatSquare(int maxA, int maxB, int maxC, int limite);
int LastFermatCubic(int maxA, int maxB, int maxC, int maxD, int limite);
int RaizCubica(double numero,double *resto);
//---------------------------------------------------------------------------
int LastFermatSquare(int maxA, int maxB, int maxC, int limite)
{
int x,y,z;
double a,b,c;
int encontradas=0,salir=0;
for(x=1;x<maxA && salir==0;x++)
for(y=1;y<maxB && salir==0;y++)
{
a=pow(x,2);
b=pow(y,2);
c=a+b;
z=sqrt(c);
c=pow(z,2);
if(a + b == c)
{
if(maxC == -1 || z <= maxC){
encontradas++;
if(encontradas == limite)
salir=1;
printf("%d^2 + %d^2 = %d^2\n",x,y,z);
}
}
}
return encontradas;
}
//---------------------------------------------------------------------------
int RaizCubica(double numero,double *resto)
{
//(3r^2*y*100) + (3r*y^2*10) + (y^3)
int resultado=0,largo,y,valor;
char n[20]={0};
char parte[25]={0};
char bajada[4]={0};
double valorParte;
sprintf(n,"%.0lf",numero);
//Obtengo el grupo de 3cifras de mas a la izquierda del número
for(largo=strlen(n);largo>3;largo-=3);
strncpy(parte,n,largo);
valorParte = atoi(parte);
//Busco el cubo mas cercano al grupo
for(y=1;pow(y,3) <= valorParte; y++);
y--;
//lo pongo en resultado
resultado=y;
//Le resto al valor de la tripleta el resultado del cubo obtenido
valorParte-=pow(resultado,3);
*resto=valorParte;
while(strlen(n) > 3){
//Elimino esa tripleta del numero
strcpy(n,&n[largo]);
//Añado detras la siguiente tripleta
strncpy(bajada,n,3);
largo=strlen(bajada);
sprintf(parte,"%.0lf",valorParte);
strcat(parte,bajada);
valorParte = atoi(parte);
valor=3*pow(resultado,2);
y=(valorParte/100)/valor;
valorParte -= (3*pow(resultado,2)*y*100)+(3*resultado* pow(y,2)*10)+pow(y,3);
*resto=valorParte;
sprintf(parte,"%.0lf",valorParte);
resultado *=10;
resultado +=y;
}
return resultado;
}
//---------------------------------------------------------------------------
int LastFermatCubic(int maxA, int maxB, int maxC, int maxD, int limite)
{
int w,x,y;
double a,b,c,d,z,resto;
int encontradas=0,salir=0;
for(w=1;w<maxA && salir==0;w++)
for(x=1;x<maxB && salir==0;x++)
for(y=1;y<maxC && salir==0;y++)
{
a=pow(w,3);
b=pow(x,3);
c=pow(y,3);
d=a+b+c;
z=RaizCubica(d,&resto);
if(resto == 0){
if(maxD == -1 || z <= maxD){
encontradas++;
if(encontradas == limite)
salir=1;
printf("%d^3 + %d^3 + %d^3 = %.0lf^3\n",w,x,y,z);
}
}
}
return encontradas;
}
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
int coincidencias;
double resto;
//Con esta funcion ponemos a A el limite maximo de 1000, B el maximo de 1000,
//C el maximo de 100, y le decimos que nos muestre las 100 primeras coincidencias
//del ultimo teorema de Fermat
coincidencias = LastFermatSquare(1000,1000, 100,100);
printf("\nEncontradas %d coincidencias\n",coincidencias);
printf("Pulsa intro para continuar");
getchar();
//Con esta funcion ponemos a A el limite maximo de 100, B el maximo de 100,
//C el maximo de 100, no ponemos limite a D y le decimos que nos muestre las 100
//primeras coincidencias del ultimo teorema de Fermat
coincidencias = LastFermatCubic(100,100,100,-1,100);
printf("\nEncontradas %d coincidencias\n",coincidencias);
printf("Pulsa intro para salir");
getchar();
return 0;
}
//---------------------------------------------------------------------------