我是一个新手,所以我为任何愚蠢的错误道歉。
以下是代码:
public static void keepOnlyCompositeNumbers( List<Integer> nums ){
int num=0;
boolean isPrime=true;
for(int i=0; i<nums.size(); i++){
num=nums.get(i);
{
for (int o = 2; o < num; ++i)
{
if (num % o == 0){
isPrime=false;
o=2;
if(isPrime==true){
nums.remove(num);
}
}
}
}
跑步者班:
Integer[] nums = {2,6,8,9,10,12,13,15,17,24,55,66,78,77,79};
List<Integer> list = new ArrayList<Integer>( Arrays.asList(nums) );
System.out.println( list );
ArrayListFunHouse.keepOnlyCompositeNumbers( list );
System.out.println( list );
什么都没打印。有人可以告诉我,我做错了吗?我被困了很长一段时间。任何帮助,将不胜感激。谢谢!
答案 0 :(得分:1)
您可以这样使用:
public static void keepOnlyCompositeNumbers( List<Integer> nums ){
boolean isPrime=false;
for(int i=0;i<nums.size();i++){
isPrime = checkPrime(nums.get(i));
if(isPrime){
nums.remove(i);
}
System.out.println(nums);
}
boolean checkPrime(int n) {
for(int i=2;i<n;i++) {
if(n%i==0)
return false;
}
return true;
}
获取for循环中的每个数字,如果返回值为真,则返回单独的for prime方法,这是素数,而不是删除它。
由于无限循环,你没有得到输出
for (int o = 2; o < num; ++i)
问题是你是增量而不是o,当获得大于2的输入时,循环将变为无限
答案 1 :(得分:1)
更高效的检查Prime
boolean checkPrime(int n) {
for(int i=2;i<=n/2;i++) {
if(n%i==0)
return false;
}
return true;
}
答案 2 :(得分:0)
请看看
public static void main(String[] args) throws IOException {
Integer[] nums = { 2, 6, 8, 9, 10, 12, 13, 15, 17, 24, 55, 66, 78, 77, 79 };
List<Integer> list = new ArrayList<Integer>(Arrays.asList(nums));
System.out.println("Original List => " + list);
keepOnlyCompositeNumbers(list);
System.out.println("FInal List => " + list);
}
public static void keepOnlyCompositeNumbers(List<Integer> nums) {
for (int i = 0 ; i < nums.size() ; i++) {
if (isPrime(nums.get(i))) {
nums.remove(i);
}
}
}
public static boolean isPrime(int number) {
for (int i = 2 ; i < number ; i++) {
if (number % i == 0) {
return false; // number is divisible so its not prime
}
}
return true; // number is prime now
}
<强>输出强>
原始列表=&gt; [2,6,8,9,10,12,13,15,17,24,55,66,78,77, 79]
FInal List =&gt; [6,8,9,10,12,15,24,55,66,78,77]
答案 3 :(得分:0)
根据Sarz的回答,这样的事情应该对checkPrimes更好一点:
public static void keepOnlyCompositeNumbers( List<Integer> nums ){
boolean isPrime=false;
for(int i=0;i<nums.size();i++){
if ( checkPrime(nums.get(i), nums))
nums.remove(i);
}
boolean checkPrime(int n, List <Integer> primes) {
sqrtn = Math.sqrt(n) ;
for (Integer p : primes) {
if (p > sqrtn)
return true;
if (n % p == 0)
return false
}
}
答案 4 :(得分:0)
这里有很多错误。可能还有其他人。
num=nums.get(i);
{
for (int o = 2; o < num; ++i)
{
if (num % o == 0){
isPrime=false;
o=2;
if(isPrime==true){
nums.remove(num);
}
}
}
1)for (int o = 2; o < num; ++i)
似乎是一个错字。当o
变为num
或更高时,循环将退出。但是你没有递增o
,而是递增i
。可以理解,因为它们在键盘上彼此相邻,并且编译器没有捕获它,因为i
作为变量存在。
2)即使您将其更改为o++
,如果数字为非素数,您也可以通过设置o=2
来破坏您的循环。这意味着o < num
将永远不会成立,因为你将它设置回2,循环将永远持续。
看来你正试图说“这个数字是复合的,所以让我们转到下一个数字”。但你不是。 nums.remove(num)
从列表中删除num
,但不会更改数字。你没有做任何事情要告诉它去下一个num
。 num
循环中没有任何内容更改for
。有一个声明指向num
外部 for
循环,但只要你陷入for
,这对你没有任何帮助。循环。
3)isPrime==true
测试位置错误。它永远不会成功,因为你只需将它设置为false
。在检查每个除数后,检验isPrime==true
的正确位置。这意味着你必须在结束大括号之后将其移动到外面 for
循环。 (另外,您不需要说if (isPrime==true)
;通常的方法只是if (isPrime)
。)
4)还有一个微妙的错误导致许多人绊倒。如果您有一个通过列表的索引,并且在该循环的中间您从列表中删除一个项目,您将错过列表中的数字。考虑一下:
List<Integer> list = new ArrayList<>(Arrays.asList(10, 20, 30, 40));
for (int i = 0; i < list.size(); i++) {
int num = list.get(i);
if (needToDelete(num)) {
list.remove(i);
}
}
第一次循环时,i
为0,num
为10.假设我们决定需要删除10个。所以我们删除它。该列表现在是[20,30,40]。然后我们返回,将i
增加到1,并将num
设置为list.get(1)
- 现在是30!所以我们从未看过元素20.
有许多方法可以区别对待。我不喜欢在for
循环中改变索引,所以我会这样做:
int i = 0;
while (i < list.size()) {
num = list.get(i);
if (needToDelete(num)) {
list.remove(i);
} else {
i++;
}
}
请注意,仅当我不从列表中删除元素时才会增加i
。如果我这样做,i
保持不变,现在将成为下一个元素的索引,因为我删除了之前的元素。
答案 5 :(得分:0)
1) Put boolean isPrime = true; inside for loop.
2) in for(int o = 2; o < num; ++i) // change ++i to ++o
3) comment out o=2; //o=2 and put a break;
4) put nums.remove(i); outside for loop
public static void keepOnlyCompositeNumbers(List<Integer> nums) {
int num = 0;
for (int i = 0; i < nums.size(); i++) {
boolean isPrime = true;
num = nums.get(i);
{
for (int o = 2; o < num; ++o) {
if (num % o == 0) {
isPrime = false;
// o=2;
break;
}
}
if (isPrime == true) {
nums.remove(i);
}
}
}
}