Java求n以内素数_求0到n之间素数个数的序列(Java)
要求:
(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)相关推荐
- java写100以内的素数_求出100以内的素数(java实现)
j package test1; //2018/11/30 //求100以内的所有素数 public class Main10 { public static void main(String[] a ...
- java永远的冒险岛珍藏版_求些像冒险岛那样的横版单机游戏
方法如下: 第一步:卸载Java虚拟机组件 以卸载Windows XP中已安装的MSJVM虚拟机为例.点击"开始→运行",在运行对话框中输入"RunDll32 advpa ...
- java输出1000以内质数_用java输出1000以内所有的质数,每行还必须只有8 个!
哈喽大家好,这里是java小白成长记! 昨天分享了用java怎么判断一个数是不是质数,看完是不是觉得也并不是很难,今天分享怎么输出1000以内的所有质数,而且每行只有8个数字. 首先判断数字的代码就不 ...
- 求近似数最值_求近似数的方法
课题:求近似数.四舍五入教学目标1.使学生理解并掌握近似数的概念.2.使学生初步掌握用"四舍五入法"求一个数的近似数.3.能正确运用"四舍五入法"解决日常生活中 ...
- java将0到9随机输出_生成0到9之间的随机整数
回答(20) 2 years ago 对于您给出的示例(从0开始直到9的整数),最干净的解决方案如下: from random import randrange randrange(10) 2 yea ...
- java虚拟机是干吗的_从头开始学习-JVM(二):为什么java需要JVM(Java虚拟机)?...
前言 在我们对java的越发了解之后,我们开始把注意力投到了java虚拟机这一块. 我们意识到,java所谓的"Write Once,Run Anywhere"的特性,就是基于JV ...
- java 求1000的阶乘_求1000阶乘的结果末尾有多少个0
素数是个科学计算中很重要的一个概念,素数也叫质数.素数就是最纯净的数,没有任何其它成分的数,其它的数都可以说是由素数相乘出来的. 所以,理解好素数,对于数学和程序来说,有重要的意义. 题目是:求100 ...
- java 显示图片的一部分_求只显示图片上半部分三分之一的写法
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import java.awt.*; import java.net.*; import javax.swing.*; public class Prac ...
- java大神请出来_求java大神,请分析以下代码,写出执行结果,并解释每行结果输出的原因。...
求java大神,请分析以下代码,写出执行结果,并解释每行结果输出的原因.classPlate{publicPlate(){System.out.println("inPlateconstru ...
最新文章
- linux i217 v网卡驱动,手动安装Intel network I217-LM网卡的Linux驱动
- 电脑home键在哪_电脑键盘各键的名称及使用方法
- hp打印机怎么连接电脑_hp打印机驱动怎么安装 惠普打印机驱动程序安装方法【详解】...
- 数组指针 vs 指针数组
- 【NLP】用腻了 CRF,试试 LAN 吧?
- 数据结构 /ord ;集合;dict()
- base command
- 英语四六级听力有线传输无线发射系统方案
- nginx autoindex自动美化
- ldo和dcdc功耗_DCDC与LDO的区别详解
- 为什么医疗行业需要完整的API管理系统?
- 1041:奇偶数判断
- linux下执行.sh文件的方法和语法
- 前端校招字节跳动面试 第三篇
- Candy -- LeetCode
- 什么是编码器、解码器?(CNN\RNN....)
- 智慧水库水位库容监测系统解决方案
- LYNC客户端不显示通讯组里的用户的解决办法。
- WPS文件格式如何进行转换 et格式转换word
- 华为手表gt2e升级鸿蒙,华为Watch GT 2e全新升级,长达两周的续航可有点秀?