2015-10-12 18 views
5

đó là bài viết đầu tiên của tôi vì vậy DO stomp tôi nếu tôi đã viết một cái gì đó ngu ngốc.Danh sách các ước của một số

Tôi vừa mới bắt đầu lớp học CNTT, và ngày hôm nay trên "trong khi" vòng lớp gia sư của tôi đã cho chúng tôi những bài tập sau đây:

Viết một chương trình mà đọc một số tự nhiên n và hiển thị trong một hộp đồ họa tất cả số chia của nó từ khoảng [2; n-1].

Cho đến nay tôi đã đưa ra một mã mà làm việc nhưng kết quả là một sai lầm chút:

import java.util.Arrays; 
import javax.swing.JOptionPane; 

public class Divisors { 
    public static void main(String[] args) { 
     String n = JOptionPane.showInputDialog(null, "Enter a natural number"); 
     Integer i = Integer.parseInt(n); 

     int d = i - 1; 
     int x = 2; 
     int[] dvr = new int[i]; // [i] because bigger numbers need more iterations 

     while (x >= 2 && x <= d) { 
      double y = i % x; 

      if (y == 0) { 
       dvr[x] = x; 
       x = x + 1; 
      } else { 
       x = x + 1; 
      } 
     } 

     JOptionPane.showMessageDialog(null, "The divisors of " + i + " are:\n" + Arrays.toString(dvr)); 
    } 
} 

Vấn đề là vòng lặp lấp đầy mảng với rất nhiều zero, và ảnh chụp màn hình của kết quả của người dạy kèm cho thấy một cửa sổ liệt kê chỉ các ước số.

Tôi đã cố gắng làm điều này với ArrayList, nhưng đó là ma thuật đen cho tôi ngay bây giờ và gia sư của tôi đã không dạy chúng tôi cách sử dụng bất cứ thứ gì ngoài những thứ được sử dụng trong mã của tôi.

Bất kỳ trợ giúp nào được đánh giá cao.

+2

Trên thực tế, mảng được khởi tạo cho tất cả các số không khi bạn tạo ra nó, vòng lặp của bạn không được làm đầy nó lên với số không . – azurefrog

+1

Vấn đề của bạn là với dvr [x] = x; Bạn không muốn đặt giá trị của số chia ở vị trí x. Bạn cần một biến thứ hai để lập chỉ mục vào mảng của bạn mà bạn chỉ tăng sau mỗi số chia mà bạn thêm vào. – bhspencer

+0

@bhspencer nhưng tôi vẫn có một số vị trí được xác định trước trong mảng – Shamanix

Trả lời

4

Vấn đề chính bạn đang gặp phải là bạn đang đi để có một số không rõ các giá trị mà bạn muốn in, nhưng bạn đang sử dụng một mảng để lưu trữ chúng và các mảng có kích thước cố định. Vì bạn có một mảng là int, nó sẽ được điền hoàn toàn với giá trị mặc định bằng 0.

Lý tưởng nhất, bạn chỉ in chuỗi giá trị khác không đầu tiên của mảng, nhưng bạn đang lưu trữ số chia nằm rải rác trong mảng của mình.

dvr[x] = x; lưu trữ từng giá trị tại chỉ mục của giá trị đó, khi thực sự bạn chỉ nên lưu trữ mỗi giá trị mới vào vị trí mở tiếp theo trong mảng.

Tạo một biến chỉ số riêng biệt, và lưu trữ mỗi giá trị sử dụng nó thay vì:

int index = 0; 
    while (x >= 2 && x <= d) { 
    ... 
     if (y == 0) { 
      dvr[index++] = x; 
    ... 

Sau đó, khi vòng lặp chính của bạn được thực hiện, bạn có thể tạo ra một "mảng hiển thị" mới mà chỉ chứa những ước, và không các số không.Tại thời điểm này, index cho bạn biết chính xác có bao lớn nó cần phải được:

int[] display = Arrays.copyOf(dvr, index); 
    JOptionPane.showMessageDialog(null, "The divisors of " + i + " are:\n" + Arrays.toString(display)); 
+0

Cảm ơn bạn rất nhiều! Đó là một lời giải thích hoàn hảo. – Shamanix

3

Trong Java, giá trị mặc định của một int là bằng không. Vì vậy, đó là lý do tại sao bạn thấy rất nhiều số không.

Vì bạn xác định kích thước của mảng là i nhiều hơn số được yêu cầu vì không có số chia nhỏ nào luôn nhỏ hơn i.

Vì vậy, thay vì in toàn bộ mảng, bạn chỉ nên in nó lên tổng số không có số chia mà bạn nên biến riêng biệt thay vì sử dụng x.

Đây là phiên bản đã sửa đổi nơi tôi đang sử dụng biến riêng biệt index để theo dõi số lượng ước tính bắt đầu từ 0. Cuối cùng bạn chỉ có thể in mảng đến index

import java.util.Arrays; 
import javax.swing.JOptionPane; 

public class Divisors { 
public static void main(String[] args) { 
    String n = JOptionPane.showInputDialog(null, "Enter a natural number"); 
    Integer i = Integer.parseInt(n); 

    int d = i - 1; 
    int index = 0; 
    int x=2; 
    int[] dvr = new int[i]; // [i] because bigger numbers need more iterations 

    while (x >= 2 && x <= d) { 
     double y = i % x; 

     if (y == 0) { 
      dvr[index] = x; 
      x = x + 1; 
      index= index + 1; 
     } else { 
      x = x + 1; 
     } 
    } 

    JOptionPane.showMessageDialog(null, "The divisors of " + i + " are:\n" + Arrays.copyOfRange(drv, 0, index)); 
} 
} 
+0

Vấn đề là, biến x cũng được tăng lên nếu kiểm tra ước lượng điều kiện thất bại (xem phần khác). Vì vậy, x, sẽ không thực sự đứng cho số lượng ước. – Ish

+0

vâng đã khắc phục được sự cố. – pgiitu

+1

Cần nói: giá trị mặc định của 'int' bằng 0. –

1

Set datastructure tránh lặp, bạn có thể sử dụng để khắc phục những vấn đề của ước trùng lặp bị thêm vào cấu trúc dữ liệu.

import java.util.*; 
    import javax.swing.JOptionPane; 

    public class Divisors { 
     public static void main(String[] args) { 
      String n = JOptionPane.showInputDialog(null, "Enter a natural number"); 
      Integer i = Integer.parseInt(n); 

      int d = i - 1; 
      int x = 2; 
      Set<Integer> divisors = new HashSet<>(); 

      while (x >= 2 && x <= d) { 
       double y = i % x; 

       if (y == 0) { 
        divisors.add(x); 
        x = x + 1; 
       } else { 
        x = x + 1; 
       } 
      } 

      List<Integer> l = new ArrayList<>(divisors); 
      JOptionPane.showMessageDialog(null, "The divisors of " + i + " are:\n" + l); 
     } 
    } 
+1

Dường như OP không muốn một giải pháp List hoặc ArrayList vì nó nằm ngoài phạm vi của lớp OP. Ngoài ra, câu trả lời này không đưa ra bất kỳ lời giải thích nào với mã. –

+0

OP không muốn là vấn đề của mình, không phải là anh ta có thể tiến bộ mà không nhận được vào danh sách hoặc ArrayList hoặc Set hoặc bất kỳ của các lớp sưu tập. Giải thích, vâng, tôi sẽ cung cấp. –

+0

@ deepakmarathe Nó không phải là tôi không muốn nó, gia sư của tôi kiểm tra mã của chúng tôi và ông đã bashed một số người sử dụng các công cụ mà ông đã không đề cập đến. Tôi biết nó xấu nhưng nó tốt hơn là không có gì ... – Shamanix

1

Sử dụng ArrayList để tạo mảng động.
Mã dưới đây sẽ giúp bạn.
Những điều cần thay đổi Trong Chương trình của bạn.

  1. nhập java.util. *;
  2. lấy một ArrayList varible
  3. gọi phương thức toString trên Object ArrayList
import java.util.*; 
import javax.swing.JOptionPane; 

public class NewClass3 { 
    public static void main(String[] args) { 
     String n = JOptionPane.showInputDialog(null, "Enter a natural number"); 
     Integer i = Integer.parseInt(n); 

     int d = i - 1; 
     int x = 2; 
     List<Integer> dvr = new ArrayList<>(); 
     while (x >= 2 && x <= d) { 
      double y = i % x; 

      if (y == 0) { 
       dvr.add(x); 
       x=x+1; 
      } else { 
       x = x + 1; 
      } 
     } 

     JOptionPane.showMessageDialog(null, "The divisors of " + i + " are:\n" + dvr.toString()); 
    } 
} 
Các vấn đề liên quan