SPOJ 02 Prime Generator

本文介绍了一个用于生成指定范围内所有质数的算法实现。该算法首先筛选出一定范围内的所有质数,然后根据输入的测试用例,输出指定区间内的所有质数。适用于密码学等领域中对质数的需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Peter wants to generate some prime numbers for his cryptosystem. Help him!Your task is to generate all prime numbers between two given numbers!

Input

The input begins with the number t of test cases in a single line (t<=10). In each of the next t lines there are two numbers m and n (1 <= m <= n <= 1000000000, n-m<=100000) separated by a space.

Output

For every test case print all prime numbers p such that m <= p <= n,one number per line, test cases separated by an empty line.

Example

Input:
2
1 10
3 5

Output:
2
3
5
7

3
5
 

彼得想要为密码系统生成一些质数。 帮助他!你的任务是生成两个给定的数字之间的所有素数!

输入

测试用例的输入始于t(t < = 10)。 在下面t行中,每行有两个数m和n(1 < = m < = n < = 1000000000,n - m < = 100000)之间用一个空格来分隔。

输出

为每个测试用例打印所有素数p,m < = p < = n,每行一个数量,测试用例之间以空行隔开。

例子

Input:
2
1 10
3 5

Output:
2
3
5
7

3
5
class Main
{
	public static void main (String[] args) throws java.lang.Exception
	{   
		int a = 31623;   //[2,n]中每一个合数都存在不大于floor(sqrt(n))的质因子(否则意味着所有质因子都大于floor(sqrt(n)),
                int pNum = 0;    //而合数至少有两个质因子,于是合数大于n,矛盾)。所以,我们只需要把[2, sqrt(n)],即[2, 31623]以内的素数筛出来。
		int[] p = new int[a];
		int[] flag = new int[a];
		for (int i = 2; i < a; i++)
		{
			if(flag[i] == 0) 
			  p[pNum++] = i;
			for(int j = 0; j < pNum && p[j] * i < a; j++) {  
               flag[p[j]*i] = 1;  
               if(i%p[j] == 0)  
                 break;  
             }  
		}
		Scanner input = new Scanner(System.in);
		int  t = input.nextInt();
		while(t > 0)
		{
		     int[]  flag1 = new int[100001];
			 int m = input.nextInt();
			 int n = input.nextInt();
			 for (int i = 0; i < pNum; i++)
			{      
				for (int j = p[i] * (m/p[i]); j <= n; j += p[i])
		          {
				if (m == 1)   //去掉1
				   flag1[0] = 1;
		                if (j >= m && j != p[i])  //只去掉合数
		                {
		                    flag1[j - m] = 1; 
		                }
		          }
		     }
			for (int i = m; i <= n; i++)
			{
				if (flag1[i-m] == 0)
	            {
					System.out.println(i);
	            }
			}
			System.out.println("\n");
			t--;
		}
		
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值