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); } } }
有个地方要改下var sqrtN = (int)Math.Sqrt(n);for (var i = 2; i < n; i++)改成for (var i = 2; i < sqrtN ; i++)不然白开方了.
变量名如果命名合理,可以代替大部分的注释判断是否是素数的方法:开方一次是减少计算量,原因你想一下就能明白 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; };
写一个试试: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); } } }}
我吃饱了撑的,也写了一个 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; } }
{
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);
}
}
}
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;
};
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);
}
}
}}
#9楼的代码(之后在#13楼做了修改),动态创建了一个委托函数,输入一个int,输出一个bool。对于输入的n,循环检查比它小的数字,如果可以整除(余数为0),那么就不是素数了,于是return false。否则,最后返回true说明这是个和素数。
这可能要求每一次使用它都要做许多除法(求余数)运算。另外,它已经在#13楼表明了,实际上只需要判断比它小的数到要判断的数的开平方即可。但是更进一步,实际上除了2以外无需对偶数求余。再进一步,只要对素数求余,而不必比较其它奇数。
{
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; }
}
按照数学定理N的素数只要去掉sqrt(n)以下素数的整数倍。这里是10.
中存在其它素数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)
不过 “不是sqrt(n)以下素数的整数倍”,而是上一次筛剩下的数中的 第一个数。
11 13 17 ……的整数倍也要筛的。
{
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();
}
{
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();
}