以为求解质数很简单,没想到深入了解后发现里面全是道道~
以下代码结果基于 unity5 编辑环境下求解得出:
以下代码结果基于 unity5 编辑环境下求解得出:
①:求N以内的所有质数并返回
//筛法 1000万以內 0.5666879秒 一亿以内 6秒
public void PrimeNumber_Sieve(int maxValue)
{
float startTime = Time.realtimeSinceStartup;
bool[] primes = new bool[maxValue+1];
for (int i=0; i<primes.Length; i++) {
primes[i] = true;
}
primes [0] = false;
primes [1] = false;
for (int i = 2; i<primes.Length; i++) {
if(primes[i] == true)
{
for (int j = 2*i; j<primes.Length; j+=i)
primes[j] = false;
}
}
//統計
int num = 0;
for (int i = 0; i<primes.Length; i++) {
if(primes[i] == true)
num++;
}
float endTime = Time.realtimeSinceStartup;
Debug.Log("运算时长:"+(endTime-startTime));
Debug.Log ("prime's count:"+num);
}
//方法一:100万以内 0.6371464秒 ; 1000万以内 14秒
public List<int> PrimeNumber(int maxValue)
{
float startTime = Time.realtimeSinceStartup;
List<int> primes = new List<int>();
primes.Add(2);
bool isPrime = false;
for(int i = 3;i<maxValue+1;i+=2)
{
int sqrtValue = (int)Mathf.Sqrt(i);
for(int j = 0;j<primes.Count;j++)
{
if(primes[j]>sqrtValue)
{
isPrime = true;
break;
}
if(i%primes[j] == 0)
{
//不是质数
isPrime = false;
break;
}
isPrime = true;
}
if(isPrime)
primes.Add(i);
}
float endTime = Time.realtimeSinceStartup;
Debug.Log("运算时长:"+(endTime-startTime));
Debug.Log (primes.Count);
return primes;
}
代码解释就不说了,如果看不懂,可以查看:http://blog.csdn.net/program_think/article/details/7032600。