gpt4 book ai didi

java - 素数Java程序

转载 作者:行者123 更新时间:2023-12-01 07:15:49 25 4
gpt4 key购买 nike

问题

在这个项目中,您将编写一个Java程序,该程序从标准输入中读取一个正整数n,然后
打印出前n个质数。我们说,如果存在,则整数m可被非零整数d整除
存在一个整数k,使得m = k d,即如果d均分为m。等效地,如果
m(整数)除以d的余数为零。我们也可以说d是一个
米的除数如果正整数p的唯一正数是1和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, …


有很多方法可以测试数字的素数,但也许最简单的方法就是简单地进行试用
师。首先将m除以2,如果将其平均除,则m不是质数。否则,除以3,
然后是4,然后是5,依此类推。如果在任何一点上发现m可被2 d m-1范围内的数字d整除,则
停止,并得出结论m是复合的。否则,得出m为质数的结论。片刻的想法表明
那个人不需要对数字d进行任何除法运算,它们本身是合成的。例如,如果
试用除以2失败(即余数非零,所以m为奇数),然后尝试除以4、6或8或任何除法
偶数,也必须失败。因此,要测试数字m的素数,只需要按
质数小于m。此外,不必一直上升到m-1。只需要一个
用2 p m范围内的质数p尝试对m进行除法。为了看到这一点,假设m> 1是复合的。
然后存在正整数a和b,使得1 a> m和b> m,然后ab> m,与m = ab相反。因此a或b之一必须小于
或等于m。

为了在Java中实现此过程,您将使用以下代码编写一个名为isPrime()的函数
签名:

static boolean isPrime(int m, int[] P) 


该函数将根据m是质数还是复合数返回true或false。数组
参数P将包含足够数量的素数以进行测试。具体来说,当时
调用isPrime()时,数组P必须(至少)包含2 p m范围内的所有素数p。例如,
要测试m = 53的素数,必须连续进行2、3、5和7的除法运算。
由于11> 53。因此,函数调用isPrime(53,P)的前提是P [0] = 2,P [1] = 3,
P [2] = 5,P [3] = 7。由于所有这些除法都会失败,因此这种情况下的返回值将为true。
与测试m = 143相似,必须进行2、3、5、7和11的除法运算(因为13> 143)。的
因此,函数调用的前提条件isPrime(143,P)为P [0] = 2,P [1] = 3,P [2] = 5,P [3] = 7,
P [4] = 11。由于11除以143,因此返回值将为false。函数isPrime()
应该包含一个遍历数组P的循环,进行试除。该循环应在以下情况终止
2
尝试除法成功,在这种情况下将返回false,或者直到P中的下一个素数更大
比m,在这种情况下,返回true。
此项目中的函数main()将读取命令行参数n,分配一个长度为n的int数组,
用素数填充数组,然后根据描述的格式将数组的内容打印到stdout
下面。在函数main()的上下文中,我们将此数组称为Primes []。因此数组Primes []
在这个项目中扮演双重角色。一方面,它用于收集,存储和打印输出数据。上
另一方面,将其传递给函数isPrime()以测试新整数的素性。每当
isPrime()返回true,新发现的素数将放置在数组中的适当位置
素数[]。该过程之所以有效,是因为如上所述,测试整数m范围所需的素数
仅最多m个,并且当m为时,所有这些素数(以及更多素数)将已经存储在Primes []数组中
经过测试。当然,必须手动初始化Primes [0] = 2,然后进行测试3、4,...
对于使用函数isPrime()的素数。

下面是函数main()中要执行的步骤的概述。


检查用户是否确实提供了一个命令行参数,该参数可以解释为
正整数如果命令行参数不是单个正整数,则您的程序
将按照以下示例中的说明打印用法消息,然后退出。
分配长度为n的数组Primes []并初始化Primes [0] = 2。
输入一个循环,该循环将发现后续的素数并将其存储为Primes [1],Primes [2],
Primes [3],...,Primes [n -1]。这个循环应该包含一个内部循环
连续整数,并通过调用函数isPrime()进行适当的测试,以测试其素数
论点。
将数组Primes []的内容打印到stdout,将10打印到由单个空格分隔的行。其他
Primes [0]至Primes [9]的单词将在第1行,Primes [10],尽管Primes [19]将
在第2行,依此类推。请注意,如果n不是10的倍数,则输出的最后一行将包含
少于10个素数。


您的程序(称为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


如您所见,不合适的命令行参数会生成一条用法消息,该消息类似于
许多Unix命令(尝试执行不带参数的more命令以查看此类消息。)
您的程序将包含一个具有签名的名为Usage()的函数

static void Usage() 


将此消息打印到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));
}
}

最佳答案

您的示例解决方案根本没有真正遵循问题的规范。您应该首先专注于编写static boolean isPrime(int m, int[] P)方法。该方法所需要做的就是:


遍历P的内容
如果元素将m均等,则m是复合的-返回false
如果元素的平方大于m,则m为质数-返回true。从问题描述中听起来这永远不会发生,P的质数从2到刚好越过sqrt(m)边界之前的质数
如果P的所有元素均已测试,则m为质数-返回true


之后,您可以编写main来制作素数数组并使用所描述的循环对其进行构建,最后进行参数检查并实现static void Usage()函数以在参数无效时调用

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com