using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; //输出结果为 //结果为:76576500 约数个数:575 //The sequence of triangle numbers is generated by adding the natural numbers. So the 7th triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. The first ten terms would be: //1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ... //Let us list the factors of the first seven triangle numbers: // 1: 1 // 3: 1,3 // 6: 1,2,3,6 //10: 1,2,5,10 //15: 1,3,5,15 //21: 1,3,7,21 //28: 1,2,4,7,14,28 //We can see that 28 is the first triangle number to have over five divisors. //What is the value of the first triangle number to have over five hundred divisors? //解决思路:首先找出一个数字的质数的分解,然后进行统计例如28=2*2*7,有两个2,一个7,则组合有2的情况:一个不取,区一个,取 //两个共三种情况,7的情况:一个不取,取一个,所以约数共有2*3 = 6个; namespace Problem12 { class Program { static void Main(string[] args) { int i = 1, j = 0, k = 0; while (true) { j = GetSum(i); k = GetDivisors(j); Console.WriteLine("该数为:{0},约数为:{1}", j, k); if (k >= 500) { break; } i++; } Console.WriteLine("该数字为:{0}", j); } //获取每个数字的值 public static int GetSum(int n) { return (n + 1) * n / 2; } //判断是不是素数 public static bool IsPrime(long l) { for (long i = 2; i < (long)Math.Sqrt(l) + 1; i++) { if (l % i == 0) { return false; } } return true; } //求出一个数的约数的个数 public static int GetDivisors(int sum) { //利用键值对来存储素数的个数 Hashtable dt = GetPrime(sum); int divisors = 1; foreach (DictionaryEntry de in dt) { divisors *= ((int)de.Value + 1); } return divisors - 1; } public static Hashtable GetPrime(int sum) { Hashtable dt = new Hashtable(); int sum1 = sum; if (sum == 1) { dt.Add(1, 1); return dt; } #region while循环体 while (sum != 1) { for (int i = 2; i <= sum; i++) { if (IsPrime(i) && sum % i == 0) { sum1 = sum / i; AddToHash(dt, i); } sum = sum1; } if (IsPrime(sum)&∑!=1) { AddToHash(dt, sum); break; } } #endregion return dt; } private static void AddToHash(Hashtable dt, int i) { if (!dt.ContainsKey(i)) { dt.Add(i, 1); } else { try { int tmp = (int)dt[i]; dt.Remove(i); dt.Add(i, tmp + 1); } catch (Exception e) { Console.WriteLine(e.StackTrace); } } } } }