在这个项目中,您将编写一个Java程序,从标准输入读取正整数n,然后打印出前n个素数.我们说如果存在整数k使得m = kd,即如果d均匀地划分为m,则整数m可被非零整数d整除.等价地,如果m(整数)除以d的余数为零,则m可被d整除.我们也会通过说d是m的除数来表达这一点.如果正整数p的唯一正除数为1且p为正整数p,则称为素数.该规则的一个例外是数字1本身,它被认为是非素数.非素数的正整数称为复合.欧几里德表明,有无数的素数.素数和复合序列开始如下:
Primes: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, …
Composites: 1, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 26, 27, 28, …
Run Code Online (Sandbox Code Playgroud)
有许多方法可以测试数字的素数,但最简单的方法就是简单地进行试验.首先将m除以2,如果它均匀分配,则m不是素数.否则,除以3,然后是4,然后是5,等等.如果在任何点发现m可以被2 dm-1范围内的数d整除,则停止,并得出结论m是复合的.否则,得出m是素数的结论.片刻的想法表明,人们不需要通过数字d进行任何试验划分,数字d本身是复合的.例如,如果试验除以2失败(即具有非零余数,因此m为奇数),则试验除以4,6或8或任何偶数也必须失败.因此,为了测试数字m的素数,只需要通过小于m的素数进行试验除法.此外,没有必要一直到m-1.人们只需要在下午2点范围内通过质数p进行m的试验分割.为了看到这一点,假设m> 1是复合的.然后存在正整数a和b,使得1 <a <m,1 <b <m,并且m = ab.但如果a> m和b> m,则ab> m,与m = ab相矛盾.因此,a或b中的一个必须小于或等于m.
要在java中实现此过程,您将编写一个名为isPrime()的函数,其函数具有以下签名:
static boolean isPrime(int m, int[] P)
Run Code Online (Sandbox Code Playgroud)
根据m是素数还是复合函数,此函数将返回true或false.数组参数P将包含足够数量的素数来进行测试.具体来说,在调用isPrime()时,数组P必须包含(至少)2 pm范围内的所有素数p.例如,要测试m = 53的素数,必须按2,3,5和7进行连续的试验除法.自11> 53以来我们不再进一步.因此函数调用isPrime(53,P)的前提条件是P [0] = 2,P [1] = 3,P [2] = 5,P [3] = 7.在这种情况下返回值是真的,因为所有这些划分都失败了.与测试m = 143类似,必须通过2,3,5,7和11(从13> 143)进行试验分割.函数调用的前提条件是Preme(143,P)因此P [0] = 2,P [1] = 3,P [2] = 5,P [3] = 7,P [4] = 11.在这种情况下返回值将为false,因为11除以143.函数isPrime()应该包含一个循环,它遍历数组P,进行试验分割.这个循环应该在2或者试验分割成功时终止,在这种情况下返回false,或者直到P中的下一个素数大于m,在这种情况下返回true.此项目中的函数main()将读取命令行参数n,分配长度为n的int数组,使用primes填充数组,然后根据下面描述的格式将数组的内容打印到stdout.在函数main()的上下文中,我们将此数组称为Primes [].因此阵列Primes []在这个项目中扮演着双重角色.一方面,它用于收集,存储和打印输出数据.另一方面,它传递给函数isPrime()来测试新整数的素数.每当isPrime()返回true时,新发现的素数将被放置在数组Primes []中的适当位置.如上所述,这个过程是有效的,因为测试整数m范围所需的素数只能达到m,并且当测试m时,所有这些素数(以及更多)将已经存储在数组Primes []中.当然有必要手动初始化Primes [0] = 2,然后使用函数isPrime()继续测试3,4,...的primality.
以下是函数main()中要执行的步骤的概述.
您的程序(称为Prime.java)将生成与下面的示例运行相同的输出.(通常%表示unix提示.)
% java Prime
Usage: java Prime [PositiveInteger]
% java Prime xyz
Usage: java Prime [PositiveInteger]
% java Prime 10 20
Usage: java Prime [PositiveInteger]
% java Prime 75
2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97 101 103 107 109 113
127 131 137 139 149 151 157 163 167 173
179 181 191 193 197 199 211 223 227 229
233 239 241 251 257 263 269 271 277 281
283 293 307 311 313 317 331 337 347 349
353 359 367 373 379
%
3
Run Code Online (Sandbox Code Playgroud)
如您所见,不适当的命令行参数会生成一条与许多unix命令类似的用法消息.(尝试使用不带参数的more命令来查看此类消息.)您的程序将包含一个名为Usage()的函数,该函数具有签名
static void Usage()
Run Code Online (Sandbox Code Playgroud)
将此消息打印到stderr,然后退出.因此,您的程序将包含三个函数:main(),isPrime()和Usage().每个应该在注释块之前给出它的名称,它的操作的简短描述,以及任何必要的前提条件(例如isPrime()的前提条件.)参见网页上的示例.
class Prime {
public static void main(String[] args) {
int num1 = 0;
int num2 = 0;
int num3;
for (num1 = 1; num1 < 101; num1++)
System.out.println(num1);
for (num2 = 1; num2 < 101; num1++)
System.out.println(num2);
num3 = num2 % num1;
if (num3 == 0)
System.out.println("The prime numbers are " + num1);
else
System.out.println("The prime numbers are " + (num1 += 1));
}
}
Run Code Online (Sandbox Code Playgroud)
Ben,看起来你正在尝试的东西远远超出你目前的能力.从一些更简单的问题开始.与您的老师交谈并考虑采取更基本的课程.您似乎不了解程序应该做什么,或者如何编写可能满足要求的程序,我们在这里所说的任何内容都无法克服这一点 - 您必须对数学和编程有更多的理解.我们很乐意为您提供帮助,但只是在这里编写您的程序对您没有帮助,而且您距离提供帮助的建议的解决方案太远了.如果这听起来很刺耳,我很抱歉; 老实说,我的意思是建设性的.请留下来 - 但开始更简单.
| 归档时间: |
|
| 查看次数: |
12749 次 |
| 最近记录: |