I've come up with a solution for Euler Problem 530, but my code runs too slowly to actually get the answer (solving for 10^15). What can I do to optimize it to run faster?
static void Main(string[] args) {
string num = Console.ReadLine();
double bigtotal = 0;
double n = double.Parse(num);
Dictionary<double, List<double>> divisorDict = new Dictionary<double, List<double>>();
Dictionary<double, double> gcdSums = new Dictionary<double, double>();
for (double i = 1; i <= n; i++) {
List<double> divisors = getDivisors(i);
divisorDict[i] = divisors;
double total = 0;
foreach (double d in divisors) {
double gcd;
if (gcdSums.ContainsKey(d)) {
gcd = gcdSums[d];
} else {
List<double> divA = divisorDict[d];
List<double> divB = divisorDict[i / d];
gcd = GCD(divA, divB);
gcdSums[d] = gcd;
}
total += gcd;
}
//Console.WriteLine("The total is " + total);
bigtotal += total;
if (i % 1000 == 0) { Console.WriteLine(i); }
}
Console.Write("The big total is" + bigtotal + "\n");
Console.Read();
}
static double GCD(List<double> divA, List<double> divB) {
foreach (double i in divA) {
foreach (double j in divB) {
if (i == j) {
return i;
}
}
}
Console.WriteLine("Error");
return 0;
}
static List<double> getDivisors(double a) {
List<double> divisors = new List<double>();
for (double i = 1; i <= a/2; i++) {
if ((a / i) % 1 == 0) {
divisors.Add(i);
}
}
divisors.Add(a);
divisors.Reverse();
return divisors;
}