33,008
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Collections.Generic;
namespace CSharpTest
{
class Program
{
public static void Main()
{
int max = 5000000;
int[] counter = CreateCounter(max);
for (int i = 0; i < counter.Length; i++)
{
int num = counter[i] - i;
if (num < counter.Length && num > i && counter[num] == counter[i])
Console.WriteLine("{0} {1}", i, num);
}
Console.ReadKey();
}
static int[] CreateCounter(int n)
{
List<int> primes = new List<int>();
int[] counter = new int[n + 1];
counter[1] = 1;
for (int i = 2; i <= n; i++)
{
if (counter[i] == 0)
{
counter[i] = i + 1;
primes.Add(i);
}
for (int j = 0; j < primes.Count; j++)
{
if (primes[j] * i > n)
break;
if (i % primes[j] == 0)
{
int k = i;
int l = primes[j] * primes[j];
while (k % primes[j] == 0)
{
l *= primes[j];
k /= primes[j];
}
counter[primes[j] * i] = counter[k] * (l - 1) / (primes[j] - 1);
break;
}
else
counter[primes[j] * i] = counter[i] * (primes[j] + 1);
}
}
return counter;
}
}
}
public static void Main()
{
int max = 5000000;
DateTime start = DateTime.Now;
int[] counter = CreateCounter(max);
for (int i = 0; i < counter.Length; i++)
{
int num = counter[i] - i;
//if (num < counter.Length && num > i && counter[num] == counter[i])
// Console.WriteLine("{0} {1}", i, num);
}
Console.WriteLine((DateTime.Now - start).TotalSeconds);
Console.ReadKey();
}