Estoy trabajando en el problema 12 con respecto al primer número de triángulo con 500 divisores. Intenté forzar brutalmente la solución. Obtengo 300 divisores en aproximadamente 35 segundos y no puedo obtener 400 en 10 minutos. Voy a modificar mi solución para usar el método del factor principal, pero ahora he visto que la gente sigue obteniendo esta solución con la fuerza bruta en menos de un minuto.Proyecto Euler Problema 12 - C++
¿Puede por favor criticar mi código y decirme si me falta algo que hace que esto sea terriblemente ineficiente?
unsigned long long TriangleNumberDivisors(int divisorTarget)
{
unsigned long long triangleNum=1;
unsigned long long currentNum=2;
int numOfDivisors=0;
numOfDivisors=NumOfDivisors(triangleNum);
while(numOfDivisors<divisorTarget)
{
triangleNum+=currentNum;
currentNum++;
numOfDivisors=NumOfDivisors(triangleNum);
}
return triangleNum;
}
int NumOfDivisors(unsigned long long dividend)
{
int numDivisors=0;
set<unsigned long long> divisors;
set<unsigned long long>::iterator it;
for(unsigned long long index=1; index<=dividend/2; index++)
{
if(dividend%index==0)
{
divisors.insert(index);
numDivisors++;
it=divisors.find(dividend/index);
if(it==divisors.end())
{
divisors.insert(dividend/index);
numDivisors++;
}
/*for some reason not checking for dups above and
just checking for how many items are in the set at the end is slower
for(it=divisors.begin();it!=divisors.end();it++)
{
numDivisors++;
}
*/
}
}
return numDivisors;
}
int main()
{
cout<<TriangleNumberDivisors(500)<<endl;
return 0;
}
Actualización: Lo tengo ahora, gracias. Se modificó para verificar solo la raíz cuadrada del número e hizo una comprobación adicional para ver si era un cuadrado perfecto. Esto me permitió eliminar el conjunto por completo también. 500 divisores funcionaron en 12 segundos.
Por favor ponga espacios alrededor de '=', '<', '=='; de lo contrario, es muy difícil. – Arun
Lea mi respuesta para la misma pregunta: http://stackoverflow.com/questions/3273379/understanding-some-math-relating-to-euler-12/3273405#3273405 :) – AraK