您的位置:首页 > 其它

蓝桥模拟题--素数个数

2018-03-29 11:44 190 查看
用 0,1,2,3 \cdots 70,1,2,3⋯7 这 88 个数组成的所有整数中,质数有多少个(每个数字必须用到且只能用一次)。提示:以 00 开始的数字是非法数字。            

网上看到很多人都用暴力求解,直接用到的是八个for循环,然后往里面套if判断
 此题,我用到的是先对数字做一个预处理,然后再判断。算法复杂度O(n)/**
* 0-7
*/
import java.util.ArrayList;

import org.junit.Test;

public class Main {

static boolean f(int n) {

for (int i = 2; i <= Math.sqrt(n); i++) {
if (n % i == 0)
return false;
}
return true;
}

static int ff(int i) {
int[] array = new int[10];
int flag = 1;
char[] str = String.valueOf(i).toCharArray();
int len = str.length;

for(int j = 0; j < len; j++) {

if (str[j] == '8' || str[j] == '9' || 1 != ++array[ str[j] - '0' ] ) {
flag = 0;
break;
}
}
return flag;
}

public static void testPrimer() {

int count = 0;

for (int i = 10234567 ; i <= 76543210; i++) {

//去掉重复的值
int flag = ff(i);

if (flag != 0 && f(i)) {
count++;
}
}
System.out.println(count);
}

public static void main(String[] args) throws InterruptedException {

testPrimer();

}
}


方法二:利用dfs生成全排列然后求解

package com.huat.algorithm;
/**
*
* @author yanzz
* @编辑时间:2018年3月15日
* @功能说明:利用dfs生成全排列函数
* @version:
*/
public class DD {

private static int[] num = new int[10];
private static boolean[] visit = new boolean[8];
private static int ans = 0;

static boolean f(int n) {

for (int i = 2; i <= Math.sqrt(n); i++) {
if (n % i == 0)
return false;
}
return true;
}

public static void print() {

int sum = 0;
if (num[0] == 0) {
return;
} else {
for (int i = 0; i < 8; i++) {
sum += (int) (num[i] * Math.pow(10, 7 - i));
}

if (f(sum))
ans++;
}
}

public static void dfs(int i) {
if (i == 8) {
print();
return;
}
// 生成1-9的全排列
for (int index = 0; index < visit.length; index++) {

if (visit[index] == false) {
visit[index] = true;
num[i] = index;
dfs(i + 1);
visit[index] = false;
}
}
}

public static void main(String[] args) {
dfs(0);
System.out.println(ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  素数个数