使用没有全0的因子打印数组

时间:2012-11-20 04:58:44

标签: java arrays sorting

我有一个问题,试图让从testperfect方法输出的数组正确打印,我知道我需要更改我的print语句但不确定如何(这句话是在最后一个方法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");
 }

}




}

3 个答案:

答案 0 :(得分:1)

为此你可以有两个解决方案。

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

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

2.使用ArrayList。它使用灵活。将完美数字添加到此ArrayList并打印出来。它只包含添加的元素。

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

ArrayList最适合这个,因为,

无需初始化所需的元素数量。它使用灵活。添加元素时会扩展。无需担心尺寸。

答案 1 :(得分: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 

答案 2 :(得分: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");
}

}

这将解决您的问题。