原题如下:
证明100 内地哥德巴赫猜想--每个不小于6的偶数都是俩素数之合
运行结果如下
6=3+3
8=3+5
10=5+5=3+7
....求代码 注释 谢谢!

解决方案 »

  1.   

    Try Func<int, bool> IsPrime = n =>
                    {
                        var sqrtN = (int)Math.Sqrt(n);                    for (var i = 2; i < n; i++)
                        {
                            if (n % i == 0) return false;
                        }                    return true;
                    };            var primeList = (from n in Enumerable.Range(2, 97) where IsPrime(n) select n).ToList();            var  evenList = (from n in Enumerable.Range(6,94) where n % 2 == 0 select n).ToList();            var ret = new Dictionary<int, List<string>>();            evenList.ForEach(p =>
                    {
                        for (var i = 0; i < primeList.Count; i++)
                        {
                            var n = primeList[i];
                            var remain = p - n;                        if (primeList.Any(e => e == remain && e >= n))
                            {
                                 List<string> list;
                                if (ret.TryGetValue(p, out list))
                                {
                                    list.Add(string.Format("{0}={1}+{2}", p, n, remain));
                                }
                                else
                                {
                                    list = new List<string>() { string.Format("{0}={1}+{2}", p, n, remain) };
                                    ret[p] = list;
                                }
                            }
                        }
                    });            if (ret.Count == evenList.Count)
                {
                    foreach (var kp in ret)
                    {
                        Console.WriteLine("---------{0}--------",kp.Key);
                        foreach (var eq in kp.Value)
                        {
                            Console.WriteLine(eq);    
                        }
                    }
                }
      

  2.   

    http://www.google.com.hk/search?sourceid=chrome&ie=UTF-8&q=%E7%B4%A0%E6%95%B0+%E5%88%A4%E5%AE%9A+%E7%AE%97%E6%B3%95
      

  3.   

    有个地方要改下var sqrtN = (int)Math.Sqrt(n);for (var i = 2; i < n; i++)改成for (var i = 2; i < sqrtN ; i++)不然白开方了.
      

  4.   

    变量名如果命名合理,可以代替大部分的注释判断是否是素数的方法:开方一次是减少计算量,原因你想一下就能明白
                    Func<int, bool> IsPrime = n =>
                    {
                        var sqrtN = (int)Math.Sqrt(n);                    for (var i = 2; i <= sqrtN ; i++)
                        {
                            if (n % i == 0) return false;
                        }                    return true;
                    };
      

  5.   

    写一个试试:using System;
    using System.Collections.Generic;
    using System.Linq;namespace ConsoleApplication1
    {
        class Program
        {        public static void Main()
            {
                计算素数();
                for (var i = 6; i <= 100; i += 2)
                {
                    Console.Write("{0}=", i);
                    var j = (from x in 素数 where 素数.Contains(i - x) select x).First();
                    Console.WriteLine("{0}+{1}", j, i - j);
                }
                Console.ReadKey();
            }        private static List<int> 素数;        private static void 计算素数()
            {
                素数 = new List<int>(50);
                素数.Add(1);
                素数.Add(2);
                bool found;
                for (var i = 3; i < 100; i += 2)
                {
                    found = false;
                    for (var p = 1; p < 素数.Count && 素数[p] * 素数[p] < i; p++)
                    {
                        if (i % 素数[p] == 0)
                        {
                            found = true;
                            break;
                        }
                    }
                    if (!found)
                        素数.Add(i);
                }
            }
        }}
      

  6.   

    首先要得到素数集合,这就不必以后判断一个数是不是素数的时候,总是去做除法运算了,而直接从素数集合中判断一下contins 就行了。如果素数集合中一直保存到5000的数(而不是100),估计10000以内的哥德巴赫猜想都能计算出来。
      

  7.   


    #9楼的代码(之后在#13楼做了修改),动态创建了一个委托函数,输入一个int,输出一个bool。对于输入的n,循环检查比它小的数字,如果可以整除(余数为0),那么就不是素数了,于是return false。否则,最后返回true说明这是个和素数。
    这可能要求每一次使用它都要做许多除法(求余数)运算。另外,它已经在#13楼表明了,实际上只需要判断比它小的数到要判断的数的开平方即可。但是更进一步,实际上除了2以外无需对偶数求余。再进一步,只要对素数求余,而不必比较其它奇数。
      

  8.   

    我吃饱了撑的,也写了一个    class Program
        {
            public static void Main()
            {
                List<int> pn = CollectPrimeNumbers(100);
                pn.ForEach(x => Console.WriteLine(x));            for (int i = 6; i < 101; i+=2)
                {
                    var q = from x in pn
                            join y in pn
                            on x equals i - y
                            select new {x, y};                var item = q.FirstOrDefault();
                    if (item == null)
                    {
                        Console.WriteLine("伟大发现:{0}", i);
                        break;                }
                    Console.WriteLine("{0} = {1} + {2}", i, item.x, item.y);
                }
                Console.ReadKey();
            }
            public static List<int> CollectPrimeNumbers(int upperBound)
            {
                if (upperBound < 3)
                {
                    throw new ArgumentOutOfRangeException("upperBound");
                }            List<int> pn = new List<int>();
                pn.Add(2);            for (int i = 3; i < upperBound; i += 2)
                {
                    if (pn.Where(x => x * x <= i).All(x => (i % x) != 0))
                    {
                        pn.Add(i);
                    }
                }            return pn;        }
        }
      

  9.   

    求100以内的素数。先去掉所有偶数。这个2也没有用嘛。然后依次去掉3/5/7/9的倍数就可以了。实际上就是3/5/7
    按照数学定理N的素数只要去掉sqrt(n)以下素数的整数倍。这里是10.
      

  10.   

    不小于6的偶数a,被小于根号a的n个(n>0)素数都能整除,若≤a/2的数
    中存在其它素数P  ,则a减P的差均为素数,而a就能分解成P与(a-P)这两个素数的
    和,即a=(1+1)。
     因为:设P为大于根号 a而又≤a/2的己知素数。
        因为a能被小于根号a的n个素数都整除,所以得出:a除以这n个素数的余数都是0,P
    不等于a除以任何小于根号a的任何素数的所得余数为0。
        又因为这n个素数的任意倍数与0的和,都还分别是这n个素数的倍数。而P是已知大于
    根号a的素数,   所以P又都不等于小于根a的任何素数的任意倍数与a除以该素数所得余
    数之和.
        所以:(a-P)为素数成立,因为P也是素数,a=P+(a-P)
      

  11.   

    筛法
    不过 “不是sqrt(n)以下素数的整数倍”,而是上一次筛剩下的数中的 第一个数。
    11 13 17 ……的整数倍也要筛的。
      

  12.   

    埃拉脱色尼的筛子:private static List<int> 素数;private static void 埃拉脱色尼的筛(int size)
    {
        var 筛子 = new bool[size];
        for (var i = 1; i < 筛子.Length; i++)
            筛子[i] = true;
        int j;
        for (var i = 3; i < Math.Sqrt(size); i++)
        {
            if (筛子[i])
                for (var p = 2; (j = i * p) < 筛子.Length; p++)
                    筛子[j] = false;
        }
        素数 = new List<int>(50);
        筛子.Where((x, index) =>
        {
            if (index > 0 && x)
                素数.Add(index);
            return false;
        }).Count();
    }
      

  13.   

    或者:private static List<int> 素数;private static void 埃拉脱色尼的筛(int size)
    {
        var 筛子 = new bool[size];
        for (var i = 1; i < 筛子.Length; i++)
            筛子[i] = true;
        int j;
        for (var i = 3; i < Math.Sqrt(size); i++)
        {
            if (筛子[i])
            {
                j = i;
                for (; (j += i) < 筛子.Length; )
                    筛子[j] = false;
            }
        }
        素数 = new List<int>(50);
        筛子.Where((x, index) =>
        {
            if (index > 0 && x)
                素数.Add(index);
            return false;
        }).Count();
    }