java math类 质数_一个获取输入范围内所有质数与质数个数的java小算法

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中,直接运行,输入单个数字即可显示结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值