Preguntas de programación de VC Programación para descomponer números enteros mayores que 1 en factores primos y encontrar su suma
/*******Decompose.h****************/
#define IS_PRINT_FACTOR 1 //Definir si para imprimir el resultado medio
clase Descomponer
{
privado:
unsigned __int64 *num;
sin firmar __int64 *suma;
int n;
público:
Descomponer();
Descomponer(int n, sin firmar __int64 * num);
virtual ~Decompose();
int primeNum(unsigned __int64 x, unsigned __int64 *fac
void primeNum(); p>
void printSum();
};
El siguiente es el archivo cpp
/////////// ////// ///////////////////////////////////////////// ////////// /////////////////
// Decompose.cpp: implementación de la clase Decompose.
//
/////////////////////////////////////// ///////////// ///////////////////////
#include "Decompose.h"
#include "stdio.h"
#include "windows.h"
/////////////// //////////////// /////////////////////////////////// ////////
// Construcción/Destrucción
/////////////////////// //////////////////// /////////////////////////////// //
Descomponer::Descomponer()
{
num=NULL
suma=NULL; p> n=0;
}
Descomponer ::Descomponer(int n, unsigned __int64 *num)
{
esto -gt; n=n;
this-gt; num=nuevo sin firmar __int64[n];
suma=nuevo sin firmar __int64[n];
for(int i=0;ilt;n;i)
this- gt;num[i]=num[i];
}
Descomponer ::~Descomponer()
{
si (num!=NULL)
eliminar[]num
;
if(suma!=NULL)
eliminar[]suma;
}
unsigned __int64 sqrt64(unsigned __int64 x)
{
int i=(sizeof(unsigned __int64)lt;lt;3)-1;
if(x==(unsigned __int64)1 )
return (unsigned __int64)1;
while(igt;=0)
{
if((xgt;gt ;i)==1)
break;
i--;
}
return (unsigned __int64)1lt;lt ;((i 2)gt;gt;1);
}
int Descomponer::primeNum(unsigned __int64 x, unsigned __int64 *fac)
{
unsigned __int64 i=2, sqrtx=sqrt64(x);
int flen=0
while(ilt; sqrtx)
{
if(xi==0)//si i es el factor de x
{
fac[flen]=i;
x/=i;
sqrtx=sqrt64(x);
}
si(i==2) i;
else i =2; //si x no es par, entonces el factor de x debe ser impar
}
fac[flen]=x;
return flen; // flen es el número de números enteros en fac
}
void Decompose::primeNum()
{
unsigned __int64 fac[64];
int i, j, flen
for(i=0; ilt; n; i)
{
flen=primeNum(num[i], fac);
#if IS_PRINT_FACTOR
printf("I64u=", num[ i]);
for(j=0;jlt;flen;j)
{
printf("I64u", fac[j]);
if(j!=flen-1)
printf("x");
else printf("\n");
}
#endif
for(j=0,sum[i]=0;jlt;flen;j)
suma[i] =fac[j];
}
}
void Descompose::printSum()
>{
int i
for(i=0; ilt; n; i )
printf("suma(I64u)=I64u\n" , num[i], suma[i]);
}
void main()
{
LARGE_INTEGER t1, t2 , frq;
unsigned __int64 num[]={1234, 1234567, 123456789, 1234567891011, 12345678910111213};
int i, n=sizeof(num)/sizeof(*num)
Descomponer d(n, num);
QueryPerformanceFrequency(amp; frq
QueryPerformanceCounter(amp; t1); > d.primeNum();
QueryPerformanceCounter(amp;t2);
printf("\n");
d.printSum();
printf("\ntime=f seg\n", (double)(t2.QuadPart-t1.QuadPart)/frq.QuadPart);
}