算法学习——枚举之基于素数的代数和

算法描述

基于素数的代数和

s(n) = (1/3)-(3/5)-(5/7)+(7/9)+...+(2n-1)/(2n+1)

分子与分母中有且只有一个素数时符号取+ 分子与分母都不是素数或者都是素数,则前面的符号取-

1.求s(2016)

2.设1<=n<=2016,求当n为多大时,s(n)最大

3.设1<=n<=2016 求当n为多大时,s(n)最接近0

算法思路

  1. 设置一个二维数组存放数值

    a[i][1]存放2i+1

    a[i][0]存放0或1

    如果2i+1是素数,则存放0,不为素数,则存放1

    比如a[3][1]=7 a[3][0]=1

  2. 当分子与分母只有一个是素数的时候,a[i][0]+a[i+1][0]=1,取+,不是的话,则取-。以此为条件,可以计算s(n)的值
  3. 求最大值,我们只需要在每次s(n)加或减之后进行一次判断,若s大于Max,则交换数值,第k项可以由公式a[i][0]=2i-1求得i,也就是k = (a[i][0]+1)/2
  4. 求最接近0的数值,需要判断,绝对值是否为最小,求绝对值可以使用Math.abs(double s)方法

算法实现

    Scanner scnner = new Scanner(System.in);
    int n = scnner.nextInt();
    scnner.close();
    int[][] a = new int[2*n+1][2];
    for(int j=0,i=1;i<=2*n+1;i=i+2,j++){
         if(panduan(i)){
            a[j][0]=1;
        }else{
            a[j][0]=0; //代表i是否为素数,0不是素数,1则是素数
        }
        a[j][1] = i; //

    }
    double s =0;
    int k1=1,k2=1;//第k项
    double max =0,min=1;//这里min最小可以取1,或者取大于1的数字,求得最接近0的k项也是同样的
    double s2=0; //存放最接近0的数值
    double temp=0;//一个暂时存放数值的变量
    for(int i=0;i<n;i++){
        if(a[i][1]==1){
            temp = (double)a[i][1]/a[i+1][1];
            s =s+ temp;
        }else if(a[i][0]+a[i+1][0]==1){
            temp = (double)a[i][1]/a[i+1][1];
            s = s +temp;
        }else{
             temp = (double)a[i][1]/a[i+1][1];
            s = s -temp;
        }
        if(s>max){
            max =s;
            k1 = (a[i+1][1]-1)/2;
        }
        if(Math.abs(s)<min){
            min =Math.abs(s);
            s2 = s;
            k2 = (a[i+1][1]-1)/2;
        }
    }
    DecimalFormat df = new DecimalFormat("0.00000");//保留5位小数
    System.out.println(df.format(s));
    Max(max, k1);
    Min(s2,k2);

    private static void Min(double min, int k2) {
        System.out.println("n为"+k2+"s最接近0");
        DecimalFormat df = new DecimalFormat("0.00000");//保留5位小数
        System.out.println(df.format(min));
    }
    private static void Max(double s,int i) {
        System.out.println("n为"+i+"s最大");
        DecimalFormat df = new DecimalFormat("0.00000");//保留5位小数
        System.out.println(df.format(s));
    }
    /**
     *
     * @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/9650214.html

时间: 2024-11-05 23:23:09

算法学习——枚举之基于素数的代数和的相关文章

算法学习 -- 枚举

在学习枚举算法之前,首先问有关枚举的几个问题 1. 为什么要进行枚举? 2. 需要对哪些对象进行枚举? 3. 如何进行枚举? 4. 枚举的结束条件是什么? 现在针对两个使用枚举算法的实例对以上问题进行分析. 实例一:熄灯问题 给定一个5×6的棋盘,上面有灯,每个灯都有各自的按钮,每个按钮按下去都会使其自己和周围的上下左右四盏灯改变(原来熄灭的变亮,原来亮的变灭),如何操作按钮使这个棋盘上所有灯都熄灭. 实例二:青蛙问题 一个5000×5000的稻田,有很多青蛙从这个稻田上跳过,每只青蛙跳过的步长

【算法学习】线性筛素数

声明:本文所涉及部分内容可能并非原创.如发现本文侵犯了您的权益,可申请博主删除. 嘛……好久没有写博客了,今天无聊来写一篇~ 为什么要写这个呢?因为这个算法让我知道了我什么都不会啊…… 闲话少说,切入正题. 1. 筛素数 素数即质数,定义就不说啦 那么我们经典的筛素数的方法呢都很简单,开一个bool数组,从1到$\sqrt n$,如果是素数就把这个数的倍数给筛掉. 时间复杂度显然:$O(nlog_n)$ 代码也很简单: void prime(int n) { for(int i = 2; i *

算法学习——枚举之最简真分数

算法描述 统计分母在指定区间[100,999]的最简真分数(分子小于分母,且分子分母无公因数)共有多少个,并求这些最简真分数的和 算法思路 对于指定区间,分母的枚举范围为 100~999 即是输入的a与b,分子最小为1,最大则比分母少一(等于分母的话就无意义) 分子与分母与某个数整除,如果同为0,这说明分子与分母有公因数 算法实现 int a,b;//上限与下限 boolean isCommon = false;//分子与分母无公因数 long m=0;//公因数的个数 int t; doubl

基于java的InputStream.read(byte[] b,int off,int len)算法学习

public int read(byte[] b, int off, int len) throws IOException 将输入流中最多 len 个数据字节读入字节数组.尝试读取多达 len 字节,但可能读取较少数量.以整数形式返回实际读取的字节数. 在输入数据可用.检测到流的末尾或者抛出异常前,此方法一直阻塞. 如果 b 为 null,则抛出 NullPointerException. 如果 off 为负,或 len 为负,或 off+len 大于数组 b 的长度,则抛出 IndexOut

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

算法描述 超级素数定义: m位超级素数本身是素数 最高位开始,去掉一位为m-1位的素数-- 例: 103不是超级素数,去掉最高位的1之后为3,不是有个2位素数,137是一个三位超级素数,去掉最高位1之后为37,37是一个二位素数,去掉3之后为7,7也是一个素数 要求: 输入整数m(1 < m<=10),统计m位超级素数的个数,并输出其中最大的m位超级素数 算法思路 设置一个判断素数的方法 1位素数只有3个,3,5,7,我们可以推测,2位超级素数的个位数只能是3,5,7,没有其他的选择了,同理,

数据挖掘算法学习(三)NaiveBayes算法

算法简单介绍 NBC是应用最广的分类算法之中的一个.朴素贝叶斯模型发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率.同一时候,NBC模型所需预计的參数非常少,对缺失数据不太敏感,算法也比較简单. 算法如果 给定目标值时属性之间互相条件独立. 算法输入 训练数据   T={(x1,y1),(x2,y2),--,(xn,yn)} 待分类数据x0=(x0(1),x0(2),--,x0(n))T 算法输出 待分类数据x0的分类结果y0∈{c1,c2,--,ck} 算法思想 weka执行 以we

PageRank算法学习与整理

PageRank 算法学习与整理 由于最近在研究图计算框架的相关问题,决定复习整理一下它的测试算法PageRank,不足之处请大家批评指正! 一. PageRank 相关背景 PageRank 的创始人拉里佩奇(Larry Page)和谢尔盖.布林(Sergey Brin),在1998年提出了该算法,并应用在Google搜索引擎的检索结果排序上,该技术也是Google早期的核心技术之一,是Google用来衡量一个网站好坏的标准. 二. Google搜索引擎工作流程 首先看一下Google搜索网页

算法学习 - HashTable开放地址法解决哈希冲突

开放地址法解决哈希冲突 线性开放地址法 线性开放地址法就是在hash之后,当发现在位置上已经存在了一个变量之后,放到它下一个位置,假如下一个位置也冲突,则继续向下,依次类推,直到找到没有变量的位置,放进去. 平方开放地址法 平方地址法就是在hash之后,当正确位置上存在冲突,不放到挨着的下一个位置,而是放到第2^0位置,假如继续冲突放到2^1的位置,依次2^3... 直到遇到不冲突的位置放进去. 双散列开放地址法 双散列同上,不过不是放到2^的位置,而是放到key - hash(key, tab

Python之路,Day21 - 常用算法学习

Python之路,Day21 - 常用算法学习 本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出.如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题.不同的算法可能用不同的时间.空间或效率来完成同样的任务.一个算法的优劣可以用空间复杂度与时间复杂度来衡量. 一个算