java之等差素数的求法

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;
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值