0

我在尝试让 testperfect 方法输出的数组正确打印时遇到问题,我知道我需要更改我的打印语句,但不确定如何(此语句在最后一个方法 printFactors 中)我需要它来打印因子在数组 testperfect 中,但我不希望它打印 0。我必须使用一个数组,并且该数组的大小为 100。

import java.util.Scanner;
public class name_perfect
{
 public static void main ( String args [] )
 {
  int gN;
  int gP = getPerfect();
  int [] array = new int[100];
  boolean tP = testPerfect(gP, array);
  printFactors(gP, array, tP);
  //System.out.println(Arrays.toString(array));
}


public static int getNum() //asks for how many numbers to test
{
 Scanner input = new Scanner ( System.in );
 System.out.print( "How many numbers would you like to test? " );
 int count = input.nextInt();
 int perfect = 1;
 boolean vN = validateNum(count, perfect);
 while(!vN)
 {
  System.out.print (" How many numbers would you like to test? ");
  count = input.nextInt();
  vN = validateNum(count, perfect);
 }
 return count;
 } 

public static boolean validateNum( int count, int perfect  ) //Checks if numbers input are valid
{
 if (( count <= 0) || ( perfect <= 0))

 { 
  System.out.print( "Non-positive numbers are not allowed.\n");
 }



 else 
 {
  return true;
 }
 return false;


}
public static int getPerfect() //asks for the numbers to test
{
 Scanner input = new Scanner ( System.in );
 int perfect = -1;
 int count = getNum();
 System.out.print("Please enter a perfect number: " );
 perfect = input.nextInt(); 
 boolean vN = validateNum(perfect, count);
 while (!vN) 
 {
  System.out.print("Please enter a perfect number: ");
  perfect = input.nextInt();
  vN=validateNum(perfect, count);
 }
 return perfect;
 }


public static boolean testPerfect( int perfect, int[] array ) //tests the numbers that were input 

{
 //testPerfect(perfect, array);
 int limit = perfect;
 int index = 0;
 for ( int i = 1; i < limit ; i++)
 {
  if ( perfect % i == 0)
   { array[i]=i;}
 }

 array[index] = perfect;

 int sum = 0;
 for ( int i = 1; i < limit; i++)
 {
  sum = sum + array[i];
 }

 if ( sum == perfect)
 {
  //Something has to change the array here.
  return true;  
 }

 else
 {
 return false;
 }


}

public static void printFactors(int perfect, int [] array, boolean tP )
 {
 if ( tP == true)
 {
 System.out.println (perfect + ":" + (Arrays.toString(array)));
 }
 else
 {
 System.out.println (perfect + ":" + "NOT PERFECT");
 }

}




}
4

3 回答 3

1

为此,您可以有两种解决方案。

1.使用任何排序技术或使用集合框架排序方法对该数组进行排序,然后遍历数组,如果元素为“0”,则不要打印。

    for(int i=0;i<array.length;i++){
       if(array[i]==0)
         continue;
    else
       System.out.println(array[i]);
    }

2.使用数组列表。它使用灵活。将完美的数字添加到这个 ArrayList 并打印出来。它将仅包含添加的元素。

 for(int i=0;arrayList.size();i++)
 {
     System.out.println(arrayList.get(i));
 }

ArrayList 是最可取的,因为,

不需要初始化你想要多少元素。它使用灵活。添加元素时它会扩展。无需担心大小。

于 2012-11-20T05:07:32.657 回答
0

我认为以下程序适用于您的情况。

import java.util.ArrayList;
import java.util.Arrays;

public class TestArray {

    private static void print(Integer[] array)
    {
        for(Integer el:array)
            System.out.print(el + " ");
        System.out.println("");
    }


    public static void main(String[] args) {

        // Constructing an Integer array. You can use input-reader to fill the array
        Integer[] array =  new Integer[]{0,1,123,456,-89,0,-1,567,0,23,231,987,0,987654,0};

        // printing the unsorted content 
        print(array);

        // sorting the array
        Arrays.sort(array);

        // printing the sorted content, with '0' values in it 
        print(array);

        //Converts the integer[] to ArrayList, so that i can easily remove elements with value '0' 
        ArrayList<Integer> arrayList = new ArrayList<Integer>(Arrays.asList(array));

        // prints the arraylist
        System.out.println(arrayList);

        //removes the elements with value '0' 
        while(arrayList.contains(new Integer(0)))
            arrayList.remove(new Integer(0));
        System.out.println(arrayList);

        // converting back to Integer[]
        array = arrayList.toArray(new Integer[]{});

        // prints to see that the final array is sorted and conatins no '0' values
        print(array);
    }
}

请测试并让我知道状态:)

和输出

0 1 123 456 -89 0 -1 567 0 23 231 987 0 987654 0 
-89 -1 0 0 0 0 0 1 23 123 231 456 567 987 987654 
[-89, -1, 0, 0, 0, 0, 0, 1, 23, 123, 231, 456, 567, 987, 987654]
[-89, -1, 1, 23, 123, 231, 456, 567, 987, 987654]
-89 -1 1 23 123 231 456 567 987 987654 

编辑

我解决了你的问题。这是另一个仅使用int[]并从中删除0元素的示例。

import java.util.Arrays;

public class TestArray {

    private static void print(int[] array)
    {
        for(int el:array)
            System.out.print(el + " ");
        System.out.println("");
    }


    public static void main(String[] args) {

        // Constructing an Integer array. You can use input-reader to fill the array
        int[] array =  new int[]{0,1,123,456,-89,0,-1,567,0,23,231,987,0,987654,0};
//      int[] array =  new int[]{1,123,456,-89,-1,567,23,231,987,987654};
//      int[] array =  new int[]{1,123,456,-89,-1,567,23,231,987,987654,0};
//      int[] array =  new int[]{1,123,456,567,23,231,987,987654};

        // printing the unsorted content 
        print(array);

        // sorting the array
        Arrays.sort(array);

        // printing the sorted content, with '0' values in it 
        print(array);

        // finds the starting and ending position of '0' elements in the sorted array
        int startPos = -1;
        int endPos = -1;
        for(int i=0;i<array.length;i++)
        {
            if(array[i]==0 && startPos == -1) startPos = i;
            if(array[i]==0) endPos = i;
        }
        System.out.println("startPos : " + startPos + " endPos : " + endPos);

        int[] newArray = null;
        if(startPos!=-1) // there are '0' elements in the array
        {
            // creates another array with new length. 
            int newArrayLength = array.length - (endPos-startPos+1);
            System.out.println("array.length : "+array.length);
            System.out.println("newArrayLength : "+newArrayLength);

            newArray = new int[newArrayLength];
            // copy the contents from original array till start of first '0' value
            System.arraycopy(array, 0, newArray, 0, startPos);
            // copy the remaining contents from original array after end of last '0' value
            System.arraycopy(array, endPos+1, newArray, startPos , newArrayLength-startPos);
        }
        else // no '0' values present in array
        {
            // just copy the original array to new array
            int newArrayLength = array.length ;
            newArray = new int[newArrayLength];
            System.arraycopy(array, 0, newArray, 0 , newArrayLength);
        }

        // prints to see that the final array is sorted and conatins no '0' values
        print(newArray);
    }
}

和输出

0 1 123 456 -89 0 -1 567 0 23 231 987 0 987654 0 
-89 -1 0 0 0 0 0 1 23 123 231 456 567 987 987654 
startPos : 2 endPos : 6
array.length : 15
newArrayLength : 10
-89 -1 1 23 123 231 456 567 987 987654 
于 2012-11-20T06:11:06.213 回答
0
  import java.util.*;
  public class TestPerfect {
public static void main(String a[]){
    ArrayList<Integer> perfectNos = new ArrayList<Integer>();
    System.out.println("Enter the perfect number");
    Scanner sc = new Scanner(System.in);
    int per = sc.nextInt();
    int perflag = 0;
    int sum = 0;
    for(int i=1;i<per;i++){
        if(per % i == 0)
            sum =sum+i;
    }
    if(sum == per){
        for(int i=1;i<per;i++)
            if(per % i == 0){
                perfectNos.add(i);
            }
        System.out.print(per+":");
        for(int i=0;i<perfectNos.size();i++)
            System.out.print(perfectNos.get(i)+" ");
    }
    else
        System.out.println(per+": NOT PERFECT");
}

}

这将解决您的问题。

于 2012-11-20T06:38:47.610 回答