蓝桥模拟题--素数个数
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);
}
}
网上看到很多人都用暴力求解,直接用到的是八个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);
}
}
相关文章推荐
- 蓝桥杯 ADV-91 算法提高 素数判断
- 蓝桥模拟题 排列序数(康托展开)
- HDU 1262 寻找素数对 模拟题
- 2013年蓝桥模拟题 画表格
- BC - The Factor(模拟题 + 素数)
- 2017蓝桥杯模拟题等差素数列
- 【NOIP模拟题】【暴力求解法】2016.11.17 第一题 素数密度 题解
- Go中的素数筛选
- 素数打表模板
- HDU 2098 分拆素数和
- 循环-15. 统计素数并求和
- 算法学习之素数
- 求最大素数
- ACMSTEP 2.1.4 Largest prime factor //数论 素数
- 筛检法求一定范围内的素数
- java_质数(素数)
- ACM22-素数求和
- 寻找大于整数m且紧靠m的k个素数
- 求2000000一下的素数和----Python
- 【程序6】判断101-200之间有多少个素数,并输出所有素数。