• 算法学习——枚举之全素组


    算法说明

    素数:只能被1与本身整除的整数。

    1和0不是素数,也不是合数

    不大于指定整数n的3个素数之和也是素数,则说这三个素数时基于整数n的全素组

    例如:n=15,素数3,5,11之和3+5+11=29也为素数,所以称3,5,11是一个基于15的全数组

    输入一个整数n(n不大于3000),输出基于n的全素组的个数,并输出最大全素组

    算法思路

    1. 先取得0~n的素数,存入数组之中
    2. 然后使用三重枚举循环,从数组之中每次取三个,判断三个数之和是否为素数
    3. 考虑到全素组数目较多,设置一个long长整型变量记录全素组的个数,同时,设置一个max记录全素组的最大值,三个变量用于接收最大全素组的三个数

    算法实现

    	Scanner scaner = new Scanner(System.in);
    	int a = scaner.nextInt();
    	scaner.close();
    	int[] b =  new int[1500];
    	long count =0;//全素组个数
    	int countsushu=0;//0~n的素数个数
    	//找出0到a的素数,存放在b数组中
    	for(int i=2,j=0;i<=a;i++){
    		if(panduan(i)){
    			b[j] = i;
    			countsushu++;
    			j++;
    		}
    	}
    	int max=0;
    	int c1=0,c2=0,c3=0;
    	for(int i=1;i<=countsushu-2;i++){
    		for(int j=i+1;j<=countsushu-1;j++){
    			for(int k=j+1;k<=countsushu;k++){
    				if(panduan(b[i]+b[j]+b[k])){
    					count= count+1;
    					if(b[i]+b[j]+b[k]>max){
    						c1=b[i];
    						c2=b[j];
    						c3=b[k];
    						max = b[i]+b[j]+b[k];
    					}
    					
    				}
    			}
    		}
    	}
    	System.out.println("共有" + count+"个全素组");
    	System.out.println("一个最大全素组为:"+c1+"+"+c2+"+"+c3+"="+max);
    }
    /**
     * 
     * @param a
     * @return 通过试商法判断a是否为素数
     */
    public static boolean panduan(int a){
    	int s = (int)Math.sqrt(a);
    	for(int i=2;i<=s;i++){
    		if(a%i==0){
    			return false;
    		}
    	}
    	return true;	
    }
    

    结果

  • 相关阅读:
    react 和 vue 的优缺点总结
    解决js小数求和出现多位小数问题
    同步循环发请求用promise
    hook中ref使用
    只能输入数字和保留三位的小树
    react添加右键点击事件
    redux
    深拷贝和浅拷贝区别及概念
    pointer-events的css属性。使用该属性可以决定是否能穿透绝对定位元素去触发下面元素的某些行为
    React 使用link在url添加参数(url中不可见)
  • 原文地址:https://www.cnblogs.com/stars-one/p/9645279.html
Copyright © 2020-2023  润新知