JAVA代码—算法基础:素数环问题
2018-03-03 02:23
921 查看
[b]素数环问题[/b]
问题描述:输入正整数n,把整数1,2,3,…n组成一个环,使得相邻两个整数之和均为素数。输出时从整数1开始逆时针排列。同一个环应恰好输出一次。N<=16。
输入样例:6
输出样例:
1 4 3 2 5 6
1 6 5 2 3 4
算法设计:
(完)
问题描述:输入正整数n,把整数1,2,3,…n组成一个环,使得相邻两个整数之和均为素数。输出时从整数1开始逆时针排列。同一个环应恰好输出一次。N<=16。
输入样例:6
输出样例:
1 4 3 2 5 6
1 6 5 2 3 4
算法设计:
package com.bean.algorithmbasic; public class PrimeRing { /* * 将从1到n这n个整数围成一个圆环,若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环。 * */ public static int NUMLENGTH = 20; public static void main(String args[]) { int[] arr = new int[NUMLENGTH]; arr[0] = 1;// 第一个数字只能为1 int k = 1; while (k >= 1) {// 极小边界限制 arr[k] = arr[k] + 1; while (arr[k] < NUMLENGTH) {// 极大边界限制 if (check(arr, k) == 1) break;// 符合条件,跳出循环 else arr[k] = arr[k] + 1;// 叠加到下一位 } if (arr[k] <= NUMLENGTH && k == NUMLENGTH - 1) {// 求解完毕,输出解 for (int x : arr) System.out.print(x + " "); return; } if (arr[k] < NUMLENGTH && k < NUMLENGTH - 1) {// 填写下一个位置 k = k + 1; } else { arr[k--] = 0;// 回溯 } } } /** * 判断当前放进的数字是否符合条件 : * 1.是否与之前重复 * 2.相邻之和是否素数 * 3.第一个和最后一个相加是否为素数 */ public static int check(int[] arr, int k) { int flag = 0; for (int i = 0; i < k; i++) {// 是否与之前重复 if (arr[i] == arr[k]) return 0; } flag = prime(arr[k - 1] + arr[k]);// 相邻之和是否素数 if (flag == 1 && k == NUMLENGTH - 1) {// k保证了为最后一个;第一个和最后一个相加是否为素数 flag = prime(arr[0] + arr[k]); } return flag; } /* * 判断之和是否为素数 */ public static int prime(int sum) { int n = (int) Math.sqrt(sum); for (int i = 2; i <= n; i++) { if (sum % i == 0) return 0; } return 1; } }
(完)
相关文章推荐
- JAVA代码—算法基础:反转整数问题
- JAVA代码—算法基础:四平方定理问题
- JAVA代码—算法基础:背包问题(基础版本:0-1背包)
- JAVA代码—算法基础:数塔问题(动态规划)
- JAVA代码—算法基础:水房接水问题
- JAVA代码—算法基础:学生出勤记录问题
- JAVA代码—算法基础:活动安排问题(贪心算法)
- JAVA代码—算法基础:整数拆分求最大乘积问题
- JAVA代码—算法基础:因子组合问题
- JAVA代码—算法基础:0-1背包问题的回溯算法设计(续)
- JAVA代码—算法基础:最大连续子数组乘积问题
- JAVA代码—算法基础:最少货币换钱问题求解(动态规划)
- JAVA代码—算法基础:蚂蚁爬行问题
- JAVA代码—算法基础:水壶分水的问题
- JAVA代码—算法基础:切割钢锯条售卖的问题
- JAVA代码—算法基础:三角形最短路径问题
- JAVA代码—算法基础:子数组的最大累加和问题
- JAVA代码—算法基础:最大数问题
- JAVA代码—算法基础:马走8×8棋盘问题
- JAVA代码—算法基础:最大连续邮资问题求解