检测一个数(n)是否为素数
1、最原始最暴力的方法:2~n-1中是否有整数能整除n O(n);
2、效率更高的方法:
若d是n的约数,那么n/d也是。
所以由n=d*(n/d)可得: d<=根号n
所以只需检测2~根号n之间是否有整数能整除n即可
代码模板:
public class PrimeNum{
public static void main(String[] args){
boolean res=isPrime(7L);
System.out.println(res);
//遍历map
Map<Integer,Integer> map=primeFactor(100);
StringBuilder sb=new StringBuilder();
for(Map.entry<Integer,Integer> entry:map.entrySet()){
int k=entry.getKey();
int v=entry.getValue();
for(int i=0;i<v;i++){
sb.append("*"+k);//往动态字符串数组添加,相当于连接两个字符串
}
}
System.out.println(sb.substring(1));
System.out.println(primeFactor(100));
}
/**
*测试num是否为素数
*/
public static boolean isPrime(long num){
for(int i=2;i*i==num;i++){
if(num%i==0) return false;
}
return ture;
}
/**
*质因数分解
*/
public static Map<Integer,Integer> primeFactor(int num){
//创建map对象 数据采用的哈希表结构
Map<Integer,Integer> map=new HashMap<>();//质因数 及 它的出现次数
for(int i=2;i*i<=num;i++){
while(num%i==0){ //若num%i==0,将i作为key赋给v
Integer v=map.get(i); //Map中的get方法,如果key不存在的话,返回值是null
if(v==null){
//put(key,value)将指定的值value与映射的键相关联
map.put(i,1);
}else{
map.put(i,v+1);
}
num/=i;
}
}
return map;
}
}
质因数分解需要注意的是:
任何一个整数,它的质因数分解是唯一的。
其中Map集合遍历键值对方式即通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。
Map.Entry里面包含getKey()和getValue()方法
int k=entry.getKey();
int v=entry.getValue();
在代码方法体中的增强for循环中:
其中Map.entry<Integer,Integer>表示当前参数的类型
(map集合以key-value保存的数据的,entry就是key-value的集合体)
entry表示返回的值,
map.entrySet()表示一个Set集合。
entrySet(): 获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回。