素數(質數)的一個用法

素數的定義

素數(質數,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));
}
}
相關文章
相關標籤/搜索