static void Main(string[] args)
 {
     FactorsGenerator fg = new FactorsGenerator();
     PrimeGenerator pg = new PrimeGenerator();
     Queue<long> consecutives = new Queue<long>();
     for (long num = 1000; ; num++)
     {
         List<long> factors = fg.GeneratorDistinctFactors(num);
         if (factors.Count != 4)
             continue;
         bool allprime = true;
         foreach (long factor in factors)
         {
             if (pg.CheckPrime((int)factor))
                 continue;
             allprime = false;
             break;
         }
         if (!allprime)
             continue;
         consecutives.Enqueue(num);
         if (CheckConsecutive(consecutives,4))
             break;
         if (consecutives.Count == 4)
             consecutives.Dequeue();
     }
     Console.WriteLine(string.Format("Result is {0}", consecutives.Peek()));
 }
 /// <summary>
 /// 由于除数数量很少,没有逐个判断是否是prime
 /// </summary>
 /// <param name="args"></param>
 static void Main(string[] args)
 {
     FactorsGenerator generator = new FactorsGenerator();
     List<long> factors = generator.GeneratorDistinctFactors(600851475143);
     foreach (long factor in factors)
     {
         Console.Write(factor + ",");
     }
     Console.ReadLine();
 }
 static List<long> findAllAbundantLessThan28123()
 {
     FactorsGenerator fg = new FactorsGenerator();
     List<long> result = new List<long>();
     for (int i = 1; i < MAXLENGTH; i++)
     {
         if (i == 28123)
             Console.WriteLine();
         AbundantCheckNumber num = BuildAbundantCheckNumber(i, fg);
         if (num.NumberType == NumberType.Abundant)
             result.Add(i);
     }
     return result;
 }
 static void Main(string[] args)
 {
     TriangleNumberGenerator tng = new TriangleNumberGenerator();
     FactorsGenerator fg = new FactorsGenerator();
     int maxDivisorCount = 0;
     while (true)
     {
         int factors = fg.GeneratorDistinctDivisorCount(tng.Next());
         if (factors > maxDivisorCount)
             maxDivisorCount = factors;
         Console.Out.WriteLine(string.Format("number:{0} - count:{1} - maxcount: {2}", tng.CurrentTriangle, factors, maxDivisorCount));
         if (factors <= 500)
             continue;
         Debug.Write(tng.CurrentTriangle + "\r\n");
         Console.Out.Write(tng.CurrentTriangle + ":");
         Console.Write("\r\n");
         break;
     }
     Console.Read();
 }
        static AbundantCheckNumber BuildAbundantCheckNumber(long value, FactorsGenerator fg)
        {
            List<long> divisors = fg.GeneratorDistinctDivisor(value);
            long sum = 0;
            foreach (long div in divisors)
            {
                if (div < value)
                    sum += div;
            }
            if (sum == value)
                return new AbundantCheckNumber() { Value = value, NumberType = NumberType.Perfect, DivisorsSum = sum };

            if (sum < value)
                return new AbundantCheckNumber() { Value = value, NumberType = NumberType.Deficient, DivisorsSum = sum };

            if (sum > value)
                return new AbundantCheckNumber() { Value = value, NumberType = NumberType.Abundant, DivisorsSum = sum };

            return new AbundantCheckNumber() { Value = value, NumberType = NumberType.NotChecked, DivisorsSum = sum };

        }
 static void Main(string[] args)
 {            
     Stopwatch sw = new Stopwatch();
     sw.Start();
     FactorsGenerator fg = new FactorsGenerator();
     float min = 1f/3;
     float max = 1f / 2;
     FactMatrix = new int[MAXNUM + 1][];
     for(int i = 0; i <= MAXNUM; i ++){
         FactMatrix[i] = fg.GeneratorDistinctFactors(i).ToArray();
     };
     sw.Stop();
     Console.WriteLine("init base data time used {0}m{1}s{2}ms", sw.Elapsed.Minutes, sw.Elapsed.Seconds, sw.Elapsed.Milliseconds);
     sw.Restart();
     int result = 0;
     for (int i = MAXNUM; i >= 2; i--)
     {
         // 计算小于此i数字所有的互质数
         for (int j = 1; j < i; j++)
         {
             // 检查是不是互质数
             if (!IsReltavePrime(i, j))
             {
                 continue;
             }
             float val = (float)j / i;
             if (val <= min)
                 continue;
             if (val >= max)
                 continue;
             result++;
         }
         // 统计在1/3 和 1/2的数字
     }
     sw.Stop();
     Console.WriteLine("result is {0}, time used {1}m{2}s{3}ms",result,sw.Elapsed.Minutes,sw.Elapsed.Seconds,sw.Elapsed.Milliseconds);
 }
 public static long GCD(long numa, long numb)
 {
     FactorsGenerator fg = new FactorsGenerator();
     List<long> fa = fg.GeneratorFactors(numa);
     List<long> fb = fg.GeneratorFactors(numb);
     int ai = 0,bi = 0;
     List<long> crossf = new List<long>();
     while (ai < fa.Count && bi < fb.Count)
     {
         long a = fa[ai];
         long b = fb[bi];
         if (a == b)
         {
             crossf.Add(a);
             ai++;
             bi++;
             continue;
         }
         if (a < b)
         {
             ai++;
             continue;
         }
         if (a > b)
         {
             bi++;
             continue;
         }
     }
     long result = 1;
     foreach (var c in crossf)
     {
         result *= c;
     }
     return result;
 }