要求:

(1) 找出0-1000之间素数

(2) 设f(n)表示0-n之间的素数个数,计算出当n=0,1,2,3,.....,997时f(n)的值,并写入文件

分析:

首先找素数使用一个效率较高的方法——Eratosthenes筛法,只要把1和不超过1000的正合数都删去。其原理为:由于正合数必有不可约数是小于等于其平方根的,只要首先求出1-1000平方根之间的全部不可约数,依次把这些不可约数之外的倍数也全部删去,剩下的正好就是不可约数。(参考《初等数论》)

其程序如下:

/***@paramsieveSize: int 素数表的长度

*@return素数表*/

public ArrayList primeSieve(intsieveSize){boolean[] sieve = new boolean[sieveSize];//初始化都是素数

for (int i = 2; i < sieve.length; i++) {

sieve[i]= true;

}

sieve[0] = false;

sieve[1] = false;//筛选

intpointer;for (int i = 2; i < (int)Math.sqrt(sieveSize)+1; i++) {

pointer= i*2;while (pointer

sieve[pointer]= false;

pointer+=i;

}

}//返回素数

ArrayList primes = new ArrayList();for (int i = 0; i < sieveSize; i++) {if(sieve[i]==true)

primes.add(i);

}returnprimes;

}

有了素数表,求f(n)就容易多了,但是只要遍历0-997,每一轮循环判断一下循环变量是否等于素数表中的某个数,等于就把当前f(n)设为某个数,否则等于前一个数,然而这样效率太低了,事实上素数表是有序的,只要不断遍历素数表相邻两个数为区间的序列,就能实现一次遍历完不需要判断

代码如下:

传入的参数array是素数表,len是所求序列的长度

public int[] countPrime(int[] array, intlen) {int[] result = new int[len];

result[0] = 0; result[1] = 0;intbegin, end;int i = 2;for (int j = 0; j < array.length-1; j++) {

begin=array[j];

end= array[j+1];

result[i]+= result[i-1]+1;

System.out.printf("=====result[%d] = %d \n", i, result[i]);

i++;

begin++;while (begin

result[i]= result[i-1];

System.out.printf("result[%d] = %d \n", i, result[i]);

begin++;

i++;

}

}

result[i]+= result[i-1]+1;

System.out.printf("=====result[%d] = %d \n", i, result[i]);returnresult;

}

把所求结果写入文件:经典的File+FileWriter+BufferedWriter即可,写入主函数

public static voidmain(String[] args) {//TODO Auto-generated method stub

CryptoTechnology ct = newCryptoTechnology();int maxNum = 1000;

System.out.println(maxNum+ "以内的素数有:");

ArrayList tableList=ct.primeSieve(maxNum);

ct.printIntegerList(tableList);int[] tablearray = new int[tableList.size()];int index = 0;

Iteratorit =tableList.iterator();while(it.hasNext()) {

Integer integer=(Integer) it.next();

tablearray[index++] =integer;

}int[] counter =ct.countPrime(tablearray, maxNum);

String content= "";for (int i = 0; i < counter.length; i++) {

content+= counter[i]+",";

}

System.out.println(content);

File file= new File("src/zhaoke/primes.txt");

FileWriter fw;try{

fw= newFileWriter(file);

BufferedWriter bw= newBufferedWriter(fw);

bw.write(content);

bw.close();

fw.close();

}catch(FileNotFoundException e) {//TODO Auto-generated catch block

e.printStackTrace();

}catch(IOException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

求出结果得到一个文件,也就是F(n)随n变化的序列。

求出结果可以试试给f(n)画个图,使用python就很容易了,代码如下:

importmatplotlib.pyplot as plt#读取文件,得到一个字符串

with open('primes.txt') as f:

line=f.readline()

f.close()

primes= line.split(',') #字符串分割

primes = list(map(int, primes)) #字符串列表转换为int列表

x =range(len(primes))

plt.plot(x, primes)#画图

#解决中文显示问题

plt.rcParams['font.sans-serif'] = ['KaiTi'] #指定默认字体

plt.rcParams['axes.unicode_minus'] = False #plt.title('f(n)随n变化的图像')

plt.xlabel('自然数序列1,2,...,n')

plt.ylabel('小于某自然数的素数个数f(n)')

plt.show()

如图:

Java求n以内素数_求0到n之间素数个数的序列(Java)相关推荐

  1. java写100以内的素数_求出100以内的素数(java实现)

    j package test1; //2018/11/30 //求100以内的所有素数 public class Main10 { public static void main(String[] a ...

  2. java永远的冒险岛珍藏版_求些像冒险岛那样的横版单机游戏

    方法如下: 第一步:卸载Java虚拟机组件 以卸载Windows XP中已安装的MSJVM虚拟机为例.点击"开始→运行",在运行对话框中输入"RunDll32 advpa ...

  3. java输出1000以内质数_用java输出1000以内所有的质数,每行还必须只有8 个!

    哈喽大家好,这里是java小白成长记! 昨天分享了用java怎么判断一个数是不是质数,看完是不是觉得也并不是很难,今天分享怎么输出1000以内的所有质数,而且每行只有8个数字. 首先判断数字的代码就不 ...

  4. 求近似数最值_求近似数的方法

    课题:求近似数.四舍五入教学目标1.使学生理解并掌握近似数的概念.2.使学生初步掌握用"四舍五入法"求一个数的近似数.3.能正确运用"四舍五入法"解决日常生活中 ...

  5. java将0到9随机输出_生成0到9之间的随机整数

    回答(20) 2 years ago 对于您给出的示例(从0开始直到9的整数),最干净的解决方案如下: from random import randrange randrange(10) 2 yea ...

  6. java虚拟机是干吗的_从头开始学习-JVM(二):为什么java需要JVM(Java虚拟机)?...

    前言 在我们对java的越发了解之后,我们开始把注意力投到了java虚拟机这一块. 我们意识到,java所谓的"Write Once,Run Anywhere"的特性,就是基于JV ...

  7. java 求1000的阶乘_求1000阶乘的结果末尾有多少个0

    素数是个科学计算中很重要的一个概念,素数也叫质数.素数就是最纯净的数,没有任何其它成分的数,其它的数都可以说是由素数相乘出来的. 所以,理解好素数,对于数学和程序来说,有重要的意义. 题目是:求100 ...

  8. java 显示图片的一部分_求只显示图片上半部分三分之一的写法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import java.awt.*; import java.net.*; import javax.swing.*; public class Prac ...

  9. java大神请出来_求java大神,请分析以下代码,写出执行结果,并解释每行结果输出的原因。...

    求java大神,请分析以下代码,写出执行结果,并解释每行结果输出的原因.classPlate{publicPlate(){System.out.println("inPlateconstru ...

最新文章

  1. linux i217 v网卡驱动,手动安装Intel network I217-LM网卡的Linux驱动
  2. 电脑home键在哪_电脑键盘各键的名称及使用方法
  3. hp打印机怎么连接电脑_hp打印机驱动怎么安装 惠普打印机驱动程序安装方法【详解】...
  4. 数组指针 vs 指针数组
  5. 【NLP】用腻了 CRF,试试 LAN 吧?
  6. 数据结构 /ord ;集合;dict()
  7. base command
  8. 英语四六级听力有线传输无线发射系统方案
  9. nginx autoindex自动美化
  10. ldo和dcdc功耗_DCDC与LDO的区别详解
  11. 为什么医疗行业需要完整的API管理系统?
  12. 1041:奇偶数判断
  13. linux下执行.sh文件的方法和语法
  14. 前端校招字节跳动面试 第三篇
  15. Candy -- LeetCode
  16. 什么是编码器、解码器?(CNN\RNN....)
  17. 智慧水库水位库容监测系统解决方案
  18. LYNC客户端不显示通讯组里的用户的解决办法。
  19. WPS文件格式如何进行转换 et格式转换word
  20. 华为手表gt2e升级鸿蒙,华为Watch GT 2e全新升级,长达两周的续航可有点秀?

热门文章

  1. ffmpeg 视频剪辑常用命令
  2. js中Blob对象一般用法
  3. shell 实例收集
  4. Android服务二 创建绑定服务
  5. html验证座机号码_html5表单pattern属性配合正则验证电话和手机号码
  6. SAP Customer Data Cloud(Gigya)的用户搜索实现
  7. H5学习从0到1-H5的基本标签(2)
  8. Linux inotify功能及实现原理【转】
  9. IntelliJ IDEA 中,英官网 - 下载地址
  10. 通过nodejs插入删除MongoDB数据