問題描述:html
寫一個程序來找第 n 個超級醜數。java
超級醜數的定義是正整數而且全部的質數因子都在所給定的一個大小爲 k 的質數集合內。測試
好比給你 4 個質數的集合 [2, 7, 13, 19], 那麼 [1, 2, 4, 7, 8, 13, 14, 16, 19, 26, 28, 32] 是前 12 個超級醜數。spa
注意事項htm
1:永遠都是超級醜數無論給的質數集合是什麼。blog
2:給你的質數集合已經按照升序排列。遞歸
0 < k ≤ 100, 0 < n ≤ 10^6, 0 < primes[i] < 1000get
樣例 :給出 n = 6 和質數集合 [2, 7, 13, 19]。it
第 6 個超級醜數爲 13,因此返回 13 做爲結果。io
代碼:
package 超級醜數;
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
System.out.println(3/2);
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
if(k<=0||k>100){
return;
}
int primes[] = new int[k];
for (int i = 0; i < primes.length; i++) {
primes[i] = sc.nextInt();
for (int j = 2; j < primes[i]/2+1; j++) {
if(primes[i]%j==0){
return;
}
}
}
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);
for (int i = 2; i < Math.pow(10, 6); i++) {
if(isSuperUglyNumber(i,primes)){
list.add(i);
}
if(list.size()==n){
System.out.println(list.get(n-1));
break;
}
}
}
//遞歸思想判斷是否爲超級醜數
private static boolean isSuperUglyNumber(int i, int[] primes) {
if(i<primes[0])return false;
else{
for (int j = primes.length-1; j >= 0; j--) {
if(i==primes[j]){
return true;
}
else if(i>primes[j]&&i%primes[j]==0){
if(isSuperUglyNumber(i/primes[j],primes)){
return true;
}
}else{
continue;
}
}
return false;
}
}
//循環思想判斷是否爲超級醜數
public static boolean isSuperUglyNumber(int num ,int[] p){
for (int i = 0; i < p.length; i++) {
int j = 0;
while(true){
if(num % p[i] != 0 ){
break;
}else{
num = num/p[i];
continue;
}
}
if(num == 1){
return true;
}
}
return false;
}
}
採用了循環和遞歸兩種思想,兩個方法均可以正確判斷到是否爲知足條件超級醜數,這裏就不放測試結果了,請自行測試
還有一些細節上的問題沒有處理,不要在乎這些哈。
轉載請註明出處哦http://www.cnblogs.com/meng1314-shuai/p/7233403.html