62,614
社区成员
发帖
与我相关
我的任务
分享
/// <summary>
/// 找出指定区间的全部素数返回.
/// 注1:maxValue只支持最大2亿,如果需要超过2亿,请考虑拆分2个数组,重新实现
/// 注2:批量查找一百万以内的素数,此方法只需要5毫秒,循环调用IsPrime要200毫秒.
/// 2亿以内有11078937个素数,本方法耗时约4秒
/// </summary>
/// <param name="maxValue"></param>
/// <param name="minValue"></param>
/// <returns></returns>
public static List<int> GetPrimes(int maxValue = 200000000, int minValue = 2)
{
if (maxValue < minValue)
{
throw new ArgumentException("最小值不能比最大值还大");
}
if (maxValue > 200000000)
{
throw new ArgumentException("最大值不能超过2亿,避免内存溢出");
}
// 从0开始,所以对result的引用,都要减1
var result = new bool[maxValue];
result[2-1] = true;
result[3-1] = true;
// 标记非2的倍数为 质数
for (var i = 5; i <= maxValue; i += 2)
{
result[i - 1] = true;
}
var sqrt = Math.Sqrt(maxValue);
for (var i = 3; i <= sqrt; i++)
{
if (result[i - 1])
{
// 标记当前质数的倍数为 非质数
for (var inner = i + i; inner <= maxValue; inner += i)
{
result[inner - 1] = false;
}
}
}
var ret = new List<int>();
for (var i = minValue; i <= maxValue; i++)
{
if (result[i - 1])
{
ret.Add(i);
}
}
return ret;
}
public List<Integer> ccc() {
List<Integer> ret = new ArrayList<>();
for (int i = 0; i < 100; i++) {
if (isPrime(i))
ret.add(i);
}
return ret;
}
static boolean isPrime(int num) {
if (num < 2)
return false;
if (num < 4) // 2和3是质数
return true;
if (num % 2 == 0)
return false;
// i+=2 减少一半循环
for (int i = 3, end = (int) (Math.sqrt(num) + 1); i < end; i += 2) {
if (num % i == 0)
return false;
}
return true;
}
public class test {
public static void main(String[] args) {
for (int i = 2; i <= 100; i++) {
boolean flag = true;
for (int j = 2; j <= i - 1; j++) {
if (i % j == 0) {
flag = false;
break;
}
}
if (flag) {
System.out.println(i);
}
}
}
}
public class test {
public static void main(String[] args) {
boolean flag=true;
for (int i = 2; i <= 100; i++) {
for (int j = 2; j <= i - 1; j++) {
if (i % j == 0) {
flag=false;
break;
}
}
if (flag) {
System.out.println(i);
}
flag=true;
}
}
}