题目是这样的:
7-1 找素数 (10 分)
请编写程序,从键盘输入两个整数m,n,找出等于或大于m的前n个素数。
输入格式:
第一个整数为m,第二个整数为n;中间使用空格隔开。例如:
103 3
输出格式:
从小到大输出找到的等于或大于m的n个素数,每个一行。例如:
103
107
109
输入样例:
9223372036854775839 2
输出样例:
9223372036854775907
9223372036854775931
看到输入输出样例你就该明白了,int,long根本招架不住这恶心心的货(^_−)☆
于是想到大整数类。
一下午,我想到了这种写法:
import java.math.BigInteger;
import java.util.Scanner;
public class text1 {
private static Scanner in;
public static void main(String args[]){
in = new Scanner(System.in);
String m=in.next();
BigInteger m1=new BigInteger(m);
String n=in.next();
BigInteger n1=new BigInteger(n);
BigInteger mBigInteger=new BigInteger("0");
BigInteger nBigInteger=new BigInteger("1");
BigInteger qBigInteger=new BigInteger("2");
//System.out.println(n1.multiply(qBigInteger));
//System.out.println((n1.multiply(qBigInteger)).subtract(nBigInteger));
for(BigInteger i =(n1.multiply(qBigInteger)).subtract(nBigInteger);i.equals(mBigInteger);i.subtract(nBigInteger)){
BigInteger t=m1.subtract(i);
if((t.multiply(qBigInteger)).equals(nBigInteger)){
System.out.println(t);
}
}
}
}
改来改去……最后,for循环里面没输出????!!!!!!!
我没办法啊,想来想去,把n就设成int型算了:
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
private static Scanner in;
public static void main(String args[]){
in = new Scanner(System.in);
String m=in.next();
BigInteger m1=new BigInteger(m);
int n=in.nextInt();
//List<BigInteger> list=new ArrayList<BigInteger>();
//list.add(m1);
System.out.println(m1);
//BigInteger mBigInteger=new BigInteger("0");
BigInteger nBigInteger=new BigInteger("1");
BigInteger qBigInteger=new BigInteger("2");
//BigInteger t=new BigInteger("3");
//System.out.println(n1.multiply(qBigInteger));
//System.out.println((n1.multiply(qBigInteger)).subtract(nBigInteger));
for(int i=2*n-1;i>=0;i--){
m1=m1.add(BigInteger.ONE);
if(m1.isProbablePrime(100)){
//list.add(m1);
System.out.println(m1);
}
}
//for(int j=list.size();j>0;j--){
//System.out.println(list.get(j-1));
//}
}
}
这一次,输入103 3出来的结果是对了,可是输入
9223372036854775839 2
就又又又又不对了!把isProbalble的参数改成50都不行。
如果我加一行输出:
for(int i=2*n-1;i>0;i--){
m1=m1.add(BigInteger.ONE);
System.out.println(m1);
if(m1.isProbablePrime(10)){
list.add(m1);
//System.out.println(m1);
}
你会看到这样的结果:
9223372036854775839 2
9223372036854775840
9223372036854775841
9223372036854775842
这严重表明:根本就没有满足if条件句的项可以添加到我的list里!(我也不对哦哦那个为什么啊。。。正如不知道第一次写的循环哪里就不对了???)如果你知道,在这篇博客下面评论哈!
已经快到晚上两点了,我把代码改成了这个版本:
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class text1 {
private static Scanner in;
public static void main(String args[]){
in = new Scanner(System.in);
String m=in.next();
BigInteger m1=new BigInteger(m);
int n=in.nextInt();
List<BigInteger> list=new ArrayList<BigInteger>();
//list.add(m1);
if(m1.isProbablePrime(50))
System.out.println(m1);
//BigInteger mBigInteger=new BigInteger("0");
BigInteger nBigInteger=new BigInteger("1");
BigInteger qBigInteger=new BigInteger("2");
//BigInteger t=new BigInteger("3");
//System.out.println(n1.multiply(qBigInteger));
//System.out.println((n1.multiply(qBigInteger)).subtract(nBigInteger));
if(m1.isProbablePrime(50)) {
for (int i =n; i > 0; i--) {
m1 = m1.add(BigInteger.ONE);
System.out.println(m1);
}
}
else{
for(int i=n;i>0;i=i--){
m1 = m1.add(qBigInteger);
System.out.println(m1);
}
}
//for(int j=0;j<list.size();j++){
//System.out.println(list.get(j));
// }
}
}
这回竟然输出的根本停不下来了!我的内心是崩溃的……
万般无奈下我找到了网上的写法……
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class text1 {
//private static Scanner in;
public static void main(String args[]){
Scanner in=new Scanner(System.in);
String sc = in.next();
BigInteger m = new BigInteger(sc);
int n = in.nextInt();
int i=0;
while(i<n){
if(isPrime(m)){
System.out.println(m);
i++;
}
m=m.add(BigInteger.ONE);
}
}
public static boolean isPrime(BigInteger num) {
return num.isProbablePrime(50);
}
}
然后就过了……就过了……我今天脑子有点不太清楚……