2012-01-14 4 views
1

정수 좌표가 0보다 작고 (0,0), (0, N), ,엔).프로젝트 오일러 233

그것은 그 F (10000) = 36

모든 양의 정수 N 1,011되도록 F (N) = 420의 합이 무엇을 표시 할 수 있는가?

좋아, 그래서 내가 여기 프로젝트 오일러 번호 (233)에 대한 기본적인 생각을 가지고 있다고 생각 내 코드입니다 :

/* 
* Andrew Koroluk 
*/ 

public class euler233 { 
public static void main(String[] args) { 
    System.out.println(f(10000)); 
    System.out.println(f(1328125)); 
    System.out.println(f(84246500)); 
    System.out.println(f(248431625)); 
    //if(true) return; 

    double ans = 0; 
    for(double N=10000; N<=(Math.pow(10, 11)); N++) { 
     //System.out.println(N); 
     if(f(N)==420) { 
      ans+= N; 
      System.out.println(N); 
     } 
    } 
    System.out.println(ans); 
} 
static double f(double N) { 
    double ans = 0;  
    double r = Math.sqrt(2*N*N)/2; 
    //System.out.println(r*r); 
    double r2 = r*r; 

    for(int x=1; x<=r; x++) { 
     for(int y=1; y<=r; y++) { 
      if(x*x + y*y == r2) { 
       ans+=4; 
       break; 
      } 
     } 
    } 

    return ans; 
} 
static boolean isInt(double a) { 
    if(a==(int)a) return true; 
    return false; 
} 
} 

기본적으로 내가 무엇을 원 안에 새겨 직각 삼각형에 대한 솔루션을 찾는 중이 야 , 원주 길이의 빗변을 갖는다. 내 코드가 맞다는 것이 확실하지 않습니다.

그것은 올바른 다음 내 문제는 F를 최적화한다 (N) 함수 F에 대한 번호를 찾기 위해 루프를 최적화 (N) = (420)는

새로운 코드의 경우 :

public class euler233 { 
    static long[] primes; 
    public static void main(String[] args) { 
     System.out.println(r(1328125)); 
     Clock c = new Clock(); 
     System.out.println(f2(10000)); 
     c.getTimeSeconds(); 
     c.reset(); 

     System.out.println(f2(1328125)); 
     c.getTimeSeconds(); 
    } 
    static long f2(long N) { 
     return SquaresR2(N*N); 
    } 
    static boolean isInt(long a) { 
     if(a==(int)a) return true; 
     return false; 
    } 
    static int SquaresR2(long n) { 
     //System.out.println("start"); 
     int sum = 0; 
     outer: 
     for(int a=0; a<Math.sqrt(n)-1; a++) { 
      for(int b=0; b<Math.sqrt(n)-1; b++) { 
       if(a*a + b*b == n) { 
        if(a>b) break outer; 
        sum+=4; 
        System.out.println(n+" = "+a+"^2 + "+b+"^2"); 
       } 
      } 
     } 
     sum*=2; 

     if(Math.sqrt(n)==(int)Math.sqrt(n)) sum+=4; 
     return sum; 
    } 
    static int r(int n) { 
     return 4*(d1(n) - d3(n)); 
    } 
    private static int d1(int n) { 
     int k=1, sum=0; 
     while(true) { 
      int d = 4*k+1; 
      if(d>n) break; 
      if(n%d==0) sum++; 
      k++; 
     } 
     return sum; 
    } 
    private static int d3(int n) { 
     int k=1, sum=0; 
     while(true) { 
      int d = 4*k+3; 
      if(d>n) break; 
      if(n%d==0) sum++; 
      k++; 
     } 
     return sum; 
    } 
} 
+1

여기서 질문은 무엇입니까? –

+0

1. 내 접근법이 맞습니까? 2. 신속하게 실행되도록 코드를 최적화하려면 어떻게해야합니까? –

+0

당신은 왜 그것을 보지 않으려는 사람들에게 호의로서 문제를 정의하지 않습니까? –

답변

6

몇 점 :

  1. 여기에 부동 소수점 숫자를 사용하지 마십시오.
  2. 그 외에도 귀하의 알고리즘은 원칙적으로 정확합니다.
  3. 그러나 그것은 우주의 열사병이 끝나기 전에 끝나지 않을 것입니다. 단지 정수

    1. 를 사용하여 수학 :

    당신은 훨씬 더 나은 방법 몇 가지 힌트를 찾을 수있다.

  4. 숫자 이론에 대한 소개를 살펴보십시오. 사각형과 직각 삼각형이 흥미로울 수 있습니다. 아, 그리고 소수.
  5. 재미있게 보내십시오.
  6. 숫자 이론을 반복하겠습니다. (그러나 아주 기본적인 것이고, 고등학교 수학 배경과 관련된 비트를 이해할 수 있지만, 약간의 시간을 투자해야합니다).
+0

-1 프로젝트 - 오일러의 아이디어는 직접 솔루션을 찾는 것입니다. 문제 페이지 하단에서 : 해결할 수 없다면 해결할 수 없습니다! http://projecteuler.net/problems를 참조하십시오. –

+3

downvote에 대해 설명해 주셔서 감사합니다.나는 너 자신에게 그것을 아주 잘하는 아이디어를 안다, 그러나 여기에 주어진 일반적인 충고는 한계 내에 잘있다, 당신은 [forum] (http://forum.projecteuler.net)에서 수많은 문제들에 대해 훨씬 더 구체적인 힌트를 얻을 수있다 - 또는 내가 참여했을 때 적어도 하나는 할 수 있었다. –

+0

포럼에서 ** 문제 해결 후 ** 해결 방법에 대해 논의 할 수 있습니다. –