一道坑我良久的PTA大整数题(欢迎大家来和我探讨)

题目是这样的:

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);
	}

	}

然后就过了……就过了……我今天脑子有点不太清楚……

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值