Ich habe das untenstehende Programm geschrieben, um das Projekt Euler 12 zu lösen, welches die Suche nach der kleinsten Dreieckszahl mit über 500 Faktoren beinhaltet.Warum stürzt dieses Programm, das die kleinste Dreieckszahl mit> 500 Faktoren findet, ab?
Ich glaube nicht, dass es größere Fehler gibt. Ich vermute, Speicheroptimierung könnte ein Problem sein. Davon abgesehen, brauche ich jedoch das unsigned long long int für die große Dreieckszahl, die letztendlich die Antwort sein wird. Ich beginne meine natürliche Zahlenfolge bei triangleNumbers [0] = 10.000.000.000. Ich weiß, dass 9.000.000.000 ungefähr 300 Faktoren haben, also war 10.000.000.000 eine "beste Schätzung". Ich nehme jedoch an, dass 10.000.000.000 die "erste natürliche Zahl" ist und fügen fortlaufend weitere natürliche Zahlen hinzu, um die "zweite" natürliche Zahl und darüber hinaus zu erhalten (also triangleNumbers [1] = 10.000.000.000 + 2, triangleNumbers [2] = 10.000.000.000 +3 und so weiter).
Alle Vorschläge und Tipps würden geschätzt. Danke, dass du einem Anfänger geholfen hast.
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
bool keepRunning=true;
unsigned long long int naturalNumberCount=0;
unsigned long long int j=4;
unsigned long long int sum=0;
vector <unsigned long long int> triangleNumbers(0);
unsigned long long int totalFactors=0;
unsigned long long int trialDivisors=1;
unsigned long long int storer=0;
int main()
{
triangleNumbers[0]=10000000000;
triangleNumbers[1]=10000000002;
triangleNumbers[2]=10000000005;
triangleNumbers[3]=10000000009;
triangleNumbers[4]=10000000014;
//listed first few prime numbers above. j is set at 4 for this reason
naturalNumberCount=5;
//10000000014 is the 5th triangle number, and 5 is the 5th natural num
//need this for recursive relation
//5th triangle number = 4th triangle num + 5 (num + naturalNumberCount
while(keepRunning)
{
for(trialDivisors;trialDivisors<=(unsigned long long int)(sqrt(triangleNumbers[j]));trialDivisors++)
{
if(triangleNumbers[j]%trialDivisors==0)
{
totalFactors++;
if(totalFactors>499)//499 because the number itself will be a divisor of itself, so no need to check
{
keepRunning=false;
break;
}
else
{
keepRunning=true;
}
}
else
{
keepRunning=true;
}
}
//need the below to generate and store the next triangle number (as next element of array)
naturalNumberCount++;//for recursive relation
storer=triangleNumbers[j];//store the (j+1)'th triangle number, since we are changing j itself
j++;//raise j, we gonna add the next value
triangleNumbers[j]=(storer+naturalNumberCount);//the new value (last triangle number + current natural)
totalFactors=0;//reset total factors to preclude any carry-over
}
cout<<triangleNumbers[j]<<flush;
return 0;
}
Also, als Sie es debuggten, wo fanden Sie, dass es abgestürzt ist? – John3136
Hier ist ein Hinweis - Sie haben einen Vektor, der leer ist und Sie versuchen, auf Elemente in ihm zuzugreifen. – PaulMcKenzie
Und inkrementieren j wird Vektor geht oit of sowieso gebunden .... – HazemGomaa