算法学习——递推之超级素数

算法描述

超级素数定义:

  1. m位超级素数本身是素数
  2. 最高位开始,去掉一位为m-1位的素数……

例: 103不是超级素数,去掉最高位的1之后为3,不是有个2位素数,137是一个三位超级素数,去掉最高位1之后为37,37是一个二位素数,去掉3之后为7,7也是一个素数

要求: 输入整数m(1 < m<=10),统计m位超级素数的个数,并输出其中最大的m位超级素数

算法思路

  1. 设置一个判断素数的方法
  2. 1位素数只有3个,3,5,7,我们可以推测,2位超级素数的个位数只能是3,5,7,没有其他的选择了,同理,3位超级素数的十位和个位数只能是二位的超级素数组成,由此我们就可以得到一个递推关系

算法实现

    Scanner scanner = new Scanner(System.in);
    int m = scanner.nextInt();
    scanner.close();
    int a[] = new int[10000];
    int b[] = new int[10000];
    int count =0;//统计超级素数的个数

    int g = 3;//记录每一个位的超级素数,当前记录的是个位的3个超级素数,3,5,7 之后每一位都会重新赋值
    a[0] = 3;
    a[1] = 5;
    a[2]=7;

    //i表示十位,所以这里i要小于m
    for(int i=1;i<m;i++){
        int t =0;
        int  e =  (int) Math.pow(10, i);//表示十位,百位…… 每一个位的阶乘
        //j*e 10,20…… 100,200……
        for(int j=1;j<=9;j++){
            //遍历a数组的全部素数
            for(int k=0;k<g;k++){
                if(panduan(e*j+a[k])){
                    b[t] = e * j +a[k];
                    t++;//统计在当前位的超级素数的个数,之后再赋值给g
                    if(i==m-1){
                        count++;//统计
                    }
                }
            }
        }
        g=t;
        //将b数组中的数据转移动a数组中,便于之后的递推
        for(int z=0;z<g;z++){
            a[z] = b[z];
        }

    }

    System.out.println(count);
    //冒泡排序,输出最大值
    for(int i=0;i<a.length-1;i++){
        for(int j=i+1;j<a.length;j++){
            if(a[i]<a[j]){
                int t = a[i];
                a[i]=a[j];
                a[j]=t;
            }
        }
    }
    System.out.println(a[0]);
}

/**
 *
 * @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;

}

结果

原文地址:https://www.cnblogs.com/kexing/p/9645779.html

时间: 2024-10-13 23:10:05

算法学习——递推之超级素数的相关文章

算法学习——递推1

递推,顾名思义,就是从一个小问题一步步推出问题的结果.在这个过程中,最主要的就是发现其中的递推关系. 给定一个数的序列H0,H1,…,Hn,…若存在整数n0,使当n>n0时,可以用等号(或大于号.小于号)将Hn与其前面的某些项Hi(0<i<n)联系起来,这样的式子就叫做递推关系. 来看一个问题:“未名湖边的烦恼” 问题描述: 每年冬天,北大未名湖上都是滑冰的好地方.北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩. 每天早上,租鞋窗口都会排起长龙,假设有还鞋的m

滑动平均滤波算法(递推平均滤波法)

//滑动平均滤波算法(递推平均滤波法) //ADNum为获得的AD数 //GN为数组value_buf[]的元素个数.该函数主要被调用,利用参数的数组传值 const int GN = 12; int filterPtr = 0; bool isFirst = true; public float gSum = 0; float[] gbuf  = new float[GN]; float GlideFilterAD(float ADNum) { if (isFirst) { isFirst =

滑动平均滤波算法(递推平均滤波法)(转帖)

//滑动平均滤波算法(递推平均滤波法)--C语言版 int FilterI=0; //ADNum为获得的AD数 //n为数组value_buf[]的元素个数.该函数主要被调用,利用参数的数组传值 int GlideFilterAD(int value_buf[],int n,int ADNum) { int sum=0; value_buf[FilterI++]=ADNum; if(FilterI==n) FilterI=0; //先进先出,再求平均值 for(int count=0;count

数据结构与算法之递推算法 C++与PHP实现

数据结构是算法实现的基础,算法总是要依赖于某种数据结构来实现的.往往是在发展一种算法的时候,构建了适合于这种算法的数据结构.一种数据结构如果脱离了算法,也就没有存在的价值了. 算法的作用----解决任何一个实际问题,都不可避免地涉及到算法的问题,通过一定的算法,得到一个最优(或较优)的方案. 递推算法:递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法. 顺推法:从已知条件出发,逐步推算出要解决的问题的方法. 逆推法:从已知问题的结果出发,用迭代表达式逐步推算

算法入门——递推

主要思想: 通过已知的条件(已知结果),利用特定的关系,逐步递推(顺推/逆推),直到有解或者无解. 主要分为两种:顺推,从已知条件出发,直至推出解. 逆推,从已知结果出发,直至推出解. 需要注意的:每一递推结果,都是下一步递推的条件. 顺推: 斐波那契数列  F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*) 实例 兔子的总数有多少? 一对兔子,每月能生一对,而每对兔子3个月后可以生育.求12个月后共有多少兔子. #include<stdio.h> #define

01python算法之递推

递推 1什么是递推?:根据已有节点的值,以及规律推出之后节点的值 2为什么要用递推:简单的解决有规矩事件 3怎么用?: 我们举个经典的例子: 如果1对兔子每月能生1对小兔子,而每对小兔在它出生后的第3个月就可以生1对小兔子,如果从1对初生的小兔子开始,1年后能繁殖多少兔子? def my1(max): a ,b,c ,i= 1,0,0 0 while i<max: c = c+b b = a a = c print a+b+c i+=1 方法:我们可以把兔子分为1个月大的,2个月大的,3个月大的

算法之——————递推的简单解释

1.顺推法:已知条件,逐步到结果,也叫迭代法,转转相除 2.逆推法:已知结果,推条件 步骤 1:确定迭代变量 2:建立迭代关系式 3:迭代过程的控制:1是计数型循环控制2,条件循环解决迭代次数无法确定的问题 关键:有迭代过程,循环结构 递推过程找迭代关系式,循环控制好迭代过程 顺推: 谷角猜想:编程打印出过程: 1 #include<stdio.h> 2 //#include<malloc> 3 #include<string.h> 4 int main() 5 { 6

算法之递推思想

一: 概念 通过已知条件,利用特定关系逐步递推,最终得到结果为止,核心就是不断的利用现有信息推导出新的东西. 二:分类 当然递推中有两种,"顺推"和"逆推" 顺推:从条件推出结果. 逆推:从结果推出条件. 三: 举例 <1> 顺推的例子 上过大学的应该都知道著名的"斐波那契"数列吧,说的是繁殖兔子的问题,题目我就大概说一下. 如果1对兔子每月能生1对小兔子,而每对小兔在它出生后的第3个月就可以生1对小兔子,如果从1对初生的小兔子开始,

蓝桥杯 算法提高 递推求值

思路: 矩阵快速幂. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 using namespace std; 5 6 typedef long long ll; 7 typedef vector<ll> vec; 8 typedef vector<vec> mat; 9 10 const int mod = 99999999; 11 12 mat mul(m