计算1-200个之间素数的和
这是浙大java基础课的习题
功能描述
- 输入n,m,并且0<n<=m<=200;
- 输出n-m个素数的和,包括第n个和第m个;
(核心)计算方式
1、正常计算
用当前数字依次除以小于这个数字质数,如果余数都不等于0,则这个数存入质数表,直至200个质数表存满
2、快速计算
原理1:
除了2、3两个质数外,所有的质数x均满足x%6=5或x%6=1;
原理2:
所有合数因式分解都有一个因数必定小于sqrt(x);假设两个因数都大于sqrt(x),则sqrt(x)*sqrt(x)必定大于x;
代码实现
第一种:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[] ar=new int[201];
ar[0] = 0; //ar[0]是需要进行输出的值
ar[1] = 2;
ar[2] = 3; //第一个第二个素数不符合下面规律,单独列出
int i=3;
if(n>0&&n<=m&&m>0&&m<=200) {
//求1-200范围内的所有素数
MAIN:
for(int x=5;i<=200;x++) {
for(int j=1;ar[j]<i;j++) {
if(x%ar[j]==0)
continue MAIN;
}
ar[i++]=x;
}
while(n<=m) {
ar[0]=ar[0]+ar[n];
n++;
}
System.out.print(ar[0]);
}
}
}
第二种:
import java.util.Scanner;
public class SuShu {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[] ar=new int[201];
ar[0] = 0; //ar[0]是需要进行输出的值
ar[1] = 2;
ar[2] = 3; //第一个第二个素数不符合下面规律,单独列出
int i=3;
if(n>0&&n<=m&&m>0&&m<=200) {
//求1-200范围内的所有素数
for(int x=5;i<=200;x++) {
if(x%6!=5&&x%6!=1)
continue;
for(int j=1;ar[j]<=(int)Math.sqrt(x);j++) {
if(x%ar[j]==0)
continue;
}
ar[i++]=x;
}
while(n<=m) {
//System.out.println(ar[n]);//测试数组中的元素的值
ar[0]=ar[0]+ar[n];
n++;
}
System.out.print(ar[0]);
}
}
}
运行截图
运行环境为 :eclipse
总结归纳
- 第一种方法容易理解,但是需要进行大量的除法运算,当数据量过大时,运行时间会过长;
- 第二种方法不易理解,虽然多了计算除以6多了一个计算除法的过程,但是在循环判断是否是质数的时候少了很多种情况,相比而言快了很多;
- 在进行是否是质数的判断时,还可以从2到ar[n]依次进行除法判断,也可以依次除以<1/2ar[n]的质数,但是相对于第二种算法都还是慢了很多,所以不做过多测试。