使用Java语言求素数的几个方法
今天看同桌找了一篇"面试50题"的文档,第一题是求fibonacci数列,使用递归很容易就实现了,没什么难度.
第二题是输出101~200之间的素数,没用太长时间也做了出来,代码如下
-
for (int i=101;i<=200;i++) { //计算到i的开方为止 int dest=(int)(Math.sqrt(i)); for (int j=2;j<=(int)(Math.sqrt(i));j++) { //如果i被j整除立刻跳出内层循环 if (i%j==0) { break; } //从2递增直到i的开方都没有除尽,也就是j递增到了dest,那么i就是素数 if (j>=dest) { System.out.print(i+" "); } } }
然后同桌进行了改进,不必进行if条件判断
2. //
a1: for (int i=101;i<=200;i++) {
for (int j=2;j<=(int)(Math.sqrt(i));j++) {
//如果i被整除,立刻跳到外层for循环
if (i%j==0){
continue a1;
}
}
//一直未被整除,输出i
System.out.print(i+" ");
}
后来又尝试用数组解决问题,不过范围是从3开始到键盘输入的数字
3. //
Scanner sc=new Scanner(System.in);
System.out.println("请输入数字:");
int number=sc.nextInt();
//创建素数数组
int[] prime=new int[10000];
prime[0]=2;
int count=1;
int time=0;
a1: for(int i=3;i<=number;i++){
//只需把素数当除数,如2,3,5,7...而不是2,3,4,5,6,7...
//但缺点是除数还是有点多,比如17的除数有2,3,5,7,11,13,
//而我们只需要除以2,3即可,因为(int)Math.sqrt(17)的值是4
for(int j=0;j<count;j++){
if(i%prime[j]==0){
continue a1;
}
}
//将素数加入数组,下标+1
prime[count]=i;
count++;
}
System.out.println("从1到"+number+"之间共有"+count+"个素数,它们分别是:");
for(int i=0;i<count;i++){
System.out.print(prime[i]+"\t");
time++;
if(time%10==0){
System.out.println();
}
}
sc.close();
}
然后对上面进行了改进
4. //
Scanner sc=new Scanner(System.in);
System.out.println("请输入数字:");
int number=sc.nextInt();
int[] prime=new int[10000];
prime[0]=2;
int count=1;
int time=0;
a1: for(int i=3;i<=number;i++){
for(int j=0;j<count;j++){
if(i%prime[j]==0){
continue a1;
}
//这两行代码就是进行的改进,也就是除数大于i的开方后,就可以确定i是素数了
//大大减少了计算量
if(prime[j]>(int)Math.sqrt(i)){
break;
}
}
prime[count]=i;
count++;
}
System.out.println("从1到"+number+"之间共有"+count+"个素数,它们分别是:");
for(int i=0;i<count;i++){
System.out.print(prime[i]+"\t");
time++;
if(time%10==0){
System.out.println();
}
}
sc.close();
}
当然,要实现要求的功能,对输出的for循环稍作修改即可,在这里就不多做描述了