문제

Eratosthenes의 체를 사용하여 모든 소수를 NUM까지 찾기 위해이 Java 프로그램을 작성하고 있지만 컴파일하려고 할 때 Long VAR을 배열 인덱스로 사용할 수 없으며 int var를 기대합니다. 그 장소. 그러나 나는 많은 숫자로 작업 할 것이므로 int를 사용할 수 없습니다. 어떡해?

import java.util.*;
import java.lang.*;

public class t3{
    public static void main(String[] args){
        long num = 100;

        //declaring list and filling it with numbers
        ArrayList<Long> numlist = new ArrayList<Long>();
        for(long x=2 ; x<num ; x++){
            numlist.add(new Long(x));
        }

        //sieve or eratosthenes
        for(long x=0 ; x<Math.sqrt(num) ; x++){
            for(long y=x+1 ; y<numlist.size() ; y++){
                if(numlist[y]%numlist[x] == 0){
                    numlist.remove(y);
                }
            }
        }

        //print list
        for(Object item : numlist){
            System.out.println((Long)item);
        }
    }
}
도움이 되었습니까?

해결책

코드가 왜 컴파일 될지 잘 모르겠습니다.

배열 목록에서 멤버에 액세스하기 위해 []를 사용해서는 안됩니다. ArrayList는 단지 배열에 내부적으로 저장된 목록입니다. 목록 get 조작을 사용해야합니다 (여전히 O (1)). numlist [index]를 작성한다는 것은 Numlist에 다양한 객체가 있음을 의미합니다. C ++에서와 같이 [] 작업을 무시할 수 없습니다.

또한 int는 Java에서 32 비트입니다. 길이가 2^32보다 큰 배열을 갖는 것은 (따라서 긴 지수가 필요할 것입니다) 가능성은 거의 없으며 사양이 허용하는지조차 확신하지 못합니다.

다른 팁

32 비트 서명 된 Int Index가 긴 [] 16GB의 RAM을 다루고 있음을 인식하십시오.

체로 큰 프라임에 도달하는 것에 대해 진지하게 생각한다면, 현재 명시 적으로 여러 가지를 벗어나지 않을 것입니다.

  • 박스형 롱의 배열 목록
  • URI가 언급 한 것처럼 []를 사용합니다
  • 디스크에 체계적으로 페이징하지 않습니다

그만큼 Java 사양 배열을 대부분의 정수로 제한합니다 .max_value 요소. a List 포함하고있을 것이다 더 많은 요소 (이것은 사실입니다 Collection에스 일반적으로), 당신은 단지 가능합니다 추가/get/remove/set 그것들을 사용합니다 int 인덱스.

많은 요소에 대한 메모리가 있다고 가정하면 (내가 생각할 것 같지는 않음), "연결된"배열로 구성된 자체 데이터 구조를 작성할 수 있습니다. 그만큼 get() 그리고 set() 방법은 long 해당 배열을 색인하고 파악하십시오 int 해당 배열 내에서 색인.

또한 각 번호를 명시 적으로 저장/제거하는 대신 부울을 사용하여 각 번호의 상태를 나타냅니다. (1) 부울은 오랫동안 공간을 덜 취하고 (2) 변속 요소 ( ArrayList) 요소를 제거하는 동안 비용이 많이들 수 있습니다.

적어도 Java 어레이의 이론적 최대 크기는 정수입니다 .max_value. 배열 인덱스의 유형이 사양에 따르면 int. 실제로 그것은 당신의 기억에 달려 있습니다.

따라서 알고리즘이 실제로 큰 배열을 갖는 데 의존한다면 Java 배열로 운이 좋지 않습니다.

의심의 여지없이 모든 공간이 필요할 것이라고 의심 할 여지가 있습니다. 배열처럼 작용하지만 메모리가 필요하지 않은 자신의 컬렉션 클래스를 작성할 수 있습니다. 주소 공간의 전체가 무너질 것입니다 (따라서 말하면). 물론 이것은 알고리즘에서 기대하는 런타임 동작을 변경할 수 있습니다.

Project Coin을 통해 Java에 긴 인덱스 어레이를 추가하는 제안이있었습니다 ( http://mail.openjdk.java.net/pipermail/coin-dev/2009-march/000869.html ) 허용되거나 예정된 것은 없지만.

간단한 해결책 : 그것을 고려합니다 num 코드 샘플에서는 100보다 크지 않으며 유형을 변경하십시오. int.

그러나 주소 공간에 대해 다른 사람들이 언급 한 요점도 좋은 점입니다.

JScience 라이브러리에는 큰 벡터가 호출됩니다 float64vector. 나는이 수업을 사용한 적이 없지만 그것은 당신의 요구에 맞을 수 있습니다. 약속이 없습니다.

편집 : Zach Scrivena는 float64vector가 ints에 치수를 받았다는 의견을 지적했습니다. 나는 수정했다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top