import java.util.Scanner;
import java.util.TreeSet;
/**
* @author lmshe
* @create 2018-07-19 16:20
* @desc
*/
public class Test {
public static void main(String[] args) {
Scanner sca = new Scanner(System.in);
long num = sca.nextLong();
primeNumber(num);
//checkNumber(num);
}
/**
* 100-25,1000-168,10000-1229,100000-9592,1000000-78498,10000000-664579
* 获取输入数字以下所有素数
*/
public static void primeNumber(long num) {
long start = System.currentTimeMillis();
TreeSet primeNumber = new TreeSet<>();
if (num < 10) {
//小于等于10,不做处理
} else {
//加入10以下素数
primeNumber.add(2);
primeNumber.add(3);
primeNumber.add(5);
primeNumber.add(7);
//大于2后,只需要判断奇数是否是素数即可
for (int i = 2; (2 * i - 1) <= num; i++) {
int curentNum = 2 * i - 1;
//过滤尾数为5的数字
if ((curentNum % 10) == 5) {
continue;
}
//过滤能被3整除的数字
if (count(curentNum) % 3 == 0) {
continue;
}
//求平方根,素数判断规则:除1和本身之外,没有其他约数,
//一个数若可以进行因数分解,那么分解时得到的两个数一定是一个小于等于sqrt(n),一个大于等于sqrt(n)
//故只需要判断该数除以小于其平方跟以下的数,是否有整除即可区分是否是素数
int sq = (int) Math.sqrt(curentNum);
for (int k = 3; k <= sq; k++) {
if (curentNum % k == 0) {
break;
}
//判断是否是素数,能除到该值平方根的绝对值,且余数不为0,肯定是素数
if (curentNum % k != 0 && k == sq) {
primeNumber.add(curentNum);
}
}
}
}
//System.out.println("素数:" + primeNumber);
System.out.println(num + "以内共有" + primeNumber.size() + "个素数");
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start));
}
/**
* 判断输入数字是否是素数
*/
public static boolean checkNumber(long num) {
long start = System.currentTimeMillis();
boolean isPrime = true;
if (num < 10) {
//小于等于10,不做处理
} else {
//过滤尾数为5的数字
if ((num % 10) == 5) {
isPrime = false;
}
//过滤能被3整除的数字
else if (count(num) % 3 == 0) {
isPrime = false;
} else {
//求平方根,素数判断规则:除1和本身之外,没有其他约数,
//一个数若可以进行因数分解,那么分解时得到的两个数一定是一个小于等于sqrt(n),一个大于等于sqrt(n)
//故只需要判断该数除以小于其平方跟以下的数,是否有整除即可区分是否是素数
int sq = (int) Math.sqrt(num);
for (int k = 3; k <= sq; k++) {
if (num % k == 0) {
isPrime = false;
break;
}
}
}
}
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start));
System.out.println("是否是素数:" + isPrime);
return isPrime;
}
//位数之和
public static int count(long num) {
int sum = 0;
while (num != 0) {
sum += num % 10;
num /= 10;
}
return sum;
}
}
在ide中,直接运行,输入单个数字即可显示结果