素數的定義
素數(質數,prime number)是一種只能被1和自己整除的數。
鼎鼎大名的RSA就是用了素數的基本特性發明的。RSA太難,不容易理解,下面的這個素數的例子就比較容易理解了。
給出兩個字符串A和B,寫出程序判斷B串裏面的字符是否都在A串中。例如
A="hssawonderfulwo"
B="who"
這個問題能夠有多種解法,好比說把A,B排序,而後比較;或者把A中的每一個字符放到Set中,而後在把B的字符依次放到Set中,若是B中字符不能放進去,那麼B中的字符A也有。
還有一種方法...
將A和B字符串中的每一個字符作素數的映射,好比T=2,h=3,...,
A的全部映射後的素數相乘獲得一個很大的數 除於
B的全部映射後的素數相乘獲得一個數,根據素數只能被1和自己整除的特色,若是可以整除說明B中的字符A都有。
固然我以爲這種算法能夠做爲一種「奇技淫巧」來聊聊,現實中若是字符串很長,這種方法可能不適合,由於映射成素數後相乘的值太大了,int 或者long都裝不下了。但這並不妨礙咱們經過這個例子來學習,素數以及素數的求法。
求素數的一個方法
因爲任何一個非素數均可以表示成一些素數的乘積,好比12 = 2*2*3, 15 = 3*5,根據這個特性,咱們每找出一個素數,就把這個素數記錄下來,添加到一個列表裏面,像這樣
2,3,5,7,11,13...
算法以下
初始化素數列表裏面只有一個數,就是2
當素數列表中的總數 < 你想要的素數的個數
把素數列表中最後數 + 1 除於 素數列表中的每一個數,若是不能整除,那麼這個數就是素數,
不然繼續 + 1,而後相似判斷
若是是素數,就添加到素數列表中
Java程序以下
package art.programming.algorithm;
import java.util.ArrayList;
import java.util.List;
public class PrimeNumberFinder {
private List<Integer> primeNumbers = new ArrayList<Integer>();
public PrimeNumberFinder(){
//Initially this list has one prime number 2
primeNumbers.add(2);
}
public List<Integer> findPrimeNumbers(int count){
for (int number = 3; primeNumbers.size() < count ;number++){
for (int i = 0; i< primeNumbers.size(); i++){
int primeNumber = primeNumbers.get(i);
//number若是可以被整除,那麼直接跳出循環
if ((number % primeNumber) == 0){
break;
}
if (i== (primeNumbers.size() - 1)){
primeNumbers.add(number);
break;
}
}
}
return primeNumbers;
}
}
接下來,求兩個字符串A中是否包括字符串B中的全部字符
package art.programming.algorithm;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class StringMatch {
public static boolean contains(String a, String b){
Map<Character, Integer> map = new HashMap<Character, Integer>();
for (char c : a.toCharArray()){
map.put(c, 0);
}
for (char c : b.toCharArray()){
map.put(c, 0);
}
int noOfChars = map.keySet().size();
List<Integer> primeNumbers = new PrimeNumberFinder().findPrimeNumbers(noOfChars);
int i =0;
for (char key : map.keySet()){
map.put(key, primeNumbers.get(i));
i++;
}
long aResult = 1;
for (char c : a.toCharArray()){
aResult = aResult * map.get(c);
System.out.println(aResult);
}
long bResult = 1;
for (char c : b.toCharArray()){
bResult = bResult * map.get(c);
}
for (char key : map.keySet()){
System.out.println(key + " " + map.get(key));
}
System.out.println("a result " + aResult + " b result " + bResult + " result " + (aResult % bResult));
return (aResult % bResult) == 0;
}
}
測試一下
package art.programming.algorithm;
import org.junit.Test;
public class StringMatchTest {
@Test
public void contains(){
String a = "hssawonderfulwo";
String b = "who";
System.out.println(StringMatch.contains(a, b));
}
}