JAVA之等差素数的求法
问题:
编程找出100以内的等差素数数列。
素数: 就是不是1的,并且除了能被他本身以外的任何一个值不能整除的数;
结果如下图:
/**
*
*/
package javaLearn;
import java.util.ArrayList;
import java.util.Arrays;
/**
* @author Administrator
*qq:1012885458
*/
public class 等差素数的数列 {
/*
*
* */
public static void main(String args[]) {
//得到100以内的素数,放在数组列表里
ArrayList pn=getPrimes(100);
//求等差素数数列,每个等差素数数列保存到数组列表中一项,数组列表中的每一项又是一个数组列表;
// System.out.println((pn.size()));
ArrayList alArNumRngs=getArithmeticalNumRanges(pn);
ArrayList alArNumRng=new ArrayList();
int intTolerace=0;
//循环输出等差素数数列
int i=0;
for( ;i<alArNumRngs.size();i++) {
//外层循环,遍历alArNumRngs
alArNumRng=(ArrayList)alArNumRngs.get(i);
for(int j=0;j<alArNumRng.size();j++) {
System.out.print(alArNumRng.get(j)+" ");
}
//计算公差
intTolerace =((Integer)alArNumRng.get(alArNumRng.size()-1)).intValue()
-((Integer)alArNumRng.get(alArNumRng.size()-2)).intValue();
//输出公差
System.out.println("公差为:"+String.valueOf(intTolerace));
}
}
/**
* @param pn
* @return
*/
private static ArrayList getArithmeticalNumRanges(ArrayList pn) {
// TODO Auto-generated method stub
Integer thirdNum=new Integer(0);//等差数列最后一个数
int tolerance =0; //公差
int diff=0; // 两素数的直接差
ArrayList alAriNumRng=null;
ArrayList alAriNumRngs= new ArrayList();
for(int i=0;i<pn.size();i++) {
for(int j=i+1;j<pn.size();j++) {
//从外循环指定元素的下一个元素遍历ArrayList
//算出公差
tolerance = ((Integer)pn.get(j)).intValue()-((Integer)pn.get(i)).intValue();
//根据公差计算第三个数
thirdNum= new Integer((Integer)pn.get(j)).intValue()+tolerance;
// 判断第三个数是不是在素数列表里,如果找到就把这三个数存入alAriNumRng数组列表
if(pn.contains(thirdNum)){
alAriNumRng= new ArrayList();
// 等差数列至少3项
alAriNumRng.add(pn.get(i));
alAriNumRng.add(pn.get(j));
alAriNumRng.add(thirdNum);
int intEndNum= thirdNum.intValue();//等差数列最后一个元素
/*
* 继续判断后面的项能不能与前面的三项构成更长的等差数列
* 从第三个数的下一个数开始,依次计算与alAriNumRng数组列表尾部的数的差,如果差等于公差,就加入该数组列表
*
* */
for(int k=pn.indexOf(thirdNum);k<pn.size();k++) {
diff=((Integer)pn.get(k)).intValue()-intEndNum;//计算后面的元素与intEndNum的差
if(diff==tolerance) {
// 相等 ,假如数列
alAriNumRng.add(pn.get(k));
intEndNum= ((Integer)pn.get(k)).intValue();//数列最后一项重新赋值
}
}
alAriNumRngs.add(alAriNumRng);
}
}
}
// System.out.println(alAriNumRngs);
return alAriNumRngs;
}
/**
* 得到i以内的素数,放入数组列表里
* @param i
* @return
*/
private static ArrayList getPrimes(int i) {
// TODO Auto-generated method stub
ArrayList allPrimeNum= new ArrayList();
for(int j=1;j<=i;j++) {
if(isPrime(j)) {
//调用素数的判断方法
allPrimeNum.add(new Integer(j));//arrayList 只能存储引用类型
}
}
System.out.println(allPrimeNum);
return allPrimeNum;
}
/**
* 素数: 大于1的整数 ,如果除了1和他本身,不能被其他整除的数;
* @param i
* @return
*/
private static boolean isPrime(int i) {
//比较是否是素数
// TODO Auto-generated method stub
if(i==1) return false ;
for(int j=2;j<=(int)Math.sqrt(i);j++) {
if(i%j==0) {
// System.out.println(false);
return false;}
}
// System.out.println(true);
return true;
}
}