数据结构求解素数环问题(JAVA版):将N个自然数(1~N),使得每相邻两数之和为素数,构成一个素数环!

//【例4.3】 求解素数环问题。
public class PrimeRing {
public PrimeRing(int n) //求1~n素数环
{
SeqList<Integer> ring = new SeqList<Integer>(n); //创建一个顺序表存储素数环
ring.append(new Integer(1)); //1添加到素数环中
SeqQueue<Integer> que = new SeqQueue<Integer>(n); //创建一个队列que// LinkedQueue<Integer> que = new LinkedQueue<Integer>(); //创建一个队列que
for (int i=2; i<=n; i++) //2~n全部入队
que.enqueue(new Integer(i));
// System.out.println(que.toString());

int i=0;
while (!que.isEmpty())
{
int k = que.dequeue().intValue(); //出队
// System.out.print("dequeue: "+k+"\t");
if (isPrime(ring.get(i)+k)) //判断是否为素数
{
i++;
ring.append(new Integer(k)); //k添加到素数环中
}
else
que.enqueue(new Integer(k)); //k再次入队
// System.out.println("队列: "+que.toString());
}
System.out.println("素数环: "+ring.toString());
}

public boolean isPrime(int k) //判断k是否为素数
{
if (k==2)
return true;
if (k<2 || k>2 && k%2==0)
return false;
int j=(int)Math.sqrt(k); //Math.sqrt(k)返回k的平方根值
if (j%2==0)
j--; //获得测试范围内的最大奇数
while (j>2 && k%j!=0)
j-=2;
return j<2;
}
public static void main(String args[])
{
new PrimeRing(10);
}
}
运行结果:素数环: (1, 2, 3, 4, 7, 10, 9, 8, 5, 6)

问题:上述的算法不完全,并且未求多个解,求完整(求多个解)算法!(N为10)

嗯。想一下。

这个是分别以每个自然数为起点,开始遍历,结果会有重复。

比如

 (1, 2, 3, 4, 7, 10, 9, 8, 5, 6)

 (6, 1, 2, 3, 4, 7, 10, 9, 8, 5)
import java.util.ArrayList;
import java.util.List;
public class PrimeRing {
// 求1~n素数环
public PrimeRing(int n) {
List<Integer> src = new ArrayList<Integer>();
List<Integer> dest = new ArrayList<Integer>();
for (int i = 1; i <= n; i++) {
src.add(i);
}
loop(src, dest, n);
}
public void loop(List<Integer> src, List<Integer> dest, int n) {
if (dest.size() == n) {
Integer start = dest.get(0);
Integer end = dest.get(dest.size() - 1);
if (isPrime(start + end)) {
System.out.println(dest);
}
return;
}
for (int i = 0; i < src.size(); i++) {
Integer element = src.remove(i);
if (dest.isEmpty()) {
dest.add(element);
} else {
Integer tmp = dest.get(dest.size() - 1);
if (isPrime(tmp + element)) {
dest.add(element);
} else {
src.add(i, element);
continue;
}
}
loop(src, dest, n);
src.add(i, element);
dest.remove(dest.size() - 1);
}
}
// 判断k是否为素数
public boolean isPrime(int k) {
if (k == 2)
return true;
if (k < 2 || k > 2 && k % 2 == 0)
return false;
int j = (int) Math.sqrt(k); // Math.sqrt(k)返回k的平方根值
if (j % 2 == 0)
j--; // 获得测试范围内的最大奇数
while (j > 2 && k % j != 0)
j -= 2;
return j < 2;
}
public static void main(String args[]) {
new PrimeRing(10);
}
}

追问

我运行了一下你的算法,能够得出所有解,但是我的题目是素数环,也就是首个数字和尾数字的和也应该要判断是否为素数。还有就是可以完善一下我上面那个用队列的算法么,麻烦啦,好的话可以给你分。

追答

你上面那个是一个解的算法,要完善什么?
我得到结果有,有首和尾,相加不是素数的吗?

if (isPrime(start + end)) {
System.out.println(dest);
}

这个地方有判断啊,应该是没有错啊。

追问

噢噢,看到了哈哈。你的算法挺好的,但是因为我这是java数据结构的课程设计,题目是完善我上面的算法,就是上面的算法的结果只有一个解,要完善的有:1.判断首尾两数之和为素数;2.给定初始序列,求多个解。 麻烦啦。

追答

SeqList

SeqQueue

这两个类是什么?我就是找不到这两个类,才换了一下,
基本和你那个差不多,判断素数的方法也没有变。

追问

这两个类 Seqlist 是顺序表类(线性表LList类的子类) SeqQueue顺序循环队列类(对列Queue的子类) 我可以发那几个类的声明给你的。

追答

嗯,好,你把这两个类发给我,这个应该是你自己实现的,我找不到这两个类。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-04-21
那就加上第一个元素和最后一个元素的判断就是!这还不全,把能写的都写出来了。这是什么书啊,求推荐啊!
第2个回答  2013-04-22
纯算法,最讨厌算法的了。。。。