[英]How to find prime numbers by using an ArrayList in java
我当时在用Java进行编码,因此我陷入了为查找质数而实现的代码中。
public class PrimeList {
ArrayList<Integer> list;
public PrimeList(int n){
list = new ArrayList<Integer>();
preparePrimeList(n);
}
private void preparePrimeList(int n){
int c =0;
for (int i=0; i<=n; i++) {
if (i%2!=0 && i%3!=0 && i%5!=0 && i%7!=0) {
list.add(i);
c++;
}
}
list.remove(0);
list.remove(1);
}
public void printPrimeList(){
System.out.println(list);
}
public boolean isPrime(int nbr){
if (list.contains(nbr)) {
return true;
}
return false;
}
public static void main(String[] args) {
PrimeList primes = new PrimeList(100);
primes.printPrimeList();
primes.isPrime(33);
}
}
运行代码时,我得到以下信息:
[11, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
为什么我输出错误? 输出应该是这样的:
2, 3, 4, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79,
83, 89, 97
false
我做错了什么?
谢谢
问题是i%2!=0 && i%3!=0 && i%5!=0 && i%7!=0
消除了丢失的数字,即2,3,5,7,因为不满足它。
另外,您将删除列表的前两个数字以说明这种情况,即1和13。(删除1后11变为索引0)。
但是,如果您的代码最多只能使用120个。之后,非质数开始出现在序列中。 要计算直至n
所有素数,您应该查看Eratosthene的筛 。
这是因为2, 3, 4, 5, 7
不符合您的条件2 % 2 == 0
, 3 % 3 == 0
等等。 您可以将条件更改为如下所示:
if ((i%2!=0 && i%3!=0 && i%5!=0 && i%7!=0) || i == 2 || i == 3 || i == 5 || i == 7){
....
}
从列表中删除的问题:
list.remove(0);
list.remove(1);
所以您在这里要做的就是删除第一个元素1,然后删除第三个元素,在删除第一个元素13后成为第二个元素
Java8版本:
System.out.println(Integer.toString(2));
IntStream.iterate(3, i -> i + 2)
.filter(potential -> IntStream.rangeClosed(3, (int)(Math.sqrt(potential)))
.allMatch(n -> potential % n != 0))
.forEach(prime -> System.out.println(Integer.toString(prime)));
您的代码完全按照您的要求执行。 它从11开始的原因是您的主要检查存在缺陷。 例如,2%2 == 0,因此程序认为2不是素数。 同样对于3、5和7。因此程序从11开始。
您可以通过编写更准确的素数检查方法来避免这种情况,而不是只用2、3、5或7检查可除性的方法。例如:
public boolean checkIfPrime(int num){
for (int x = 2; x < (int)Math.sqrt(num); x++)
if (num % x == 0)
return false;
return true;
}
另外,在尝试从列表中删除第一项时,实际上删除了第一和第三项(因为第三位置2移到了第二位置1)。 那就是为什么在您的程序中删除了13。
将list.remove(1)替换为list.remove(0)(因此有两个)。
希望这可以帮助!
试试这个
ArrayList <Integer> Primes= new ArrayList<>(0);
Integer count=0;
Integer value=0;
Integer numberOfPrimes=100;
do {
if(isPrime(value,Primes)) {
Primes.add(value);
count++;
}
value++;
}while(count<numberOfPrimes);
System.out.println(Primes.toString());
static boolean isPrime(Integer value, ArrayList <Integer> Primes) {
if(value==0) {
return false;
}
for(int i=0;i<Primes.size() && Primes.get(i)< Math.sqrt(value);i++) {
if(value%Primes.get(i)==0 && Primes.get(i)!=1) {
return false;
}
}
return true;
}
import java.util.Arrays;
import java.util.List;
public class PrimeTest {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9);
for(Integer num: numbers){
if(isprime(num,numbers.size())){
System.out.println(num);
}
}
}
private static boolean isprime(int n,int length) {
for(int i=2; i<=length && i<=n ;i++){
if(i<n && String.valueOf((float)n/(float)i).endsWith("0")){
return false;
}else if (n==i && n%i==0){
return true;
}
}
return false;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.