2012-01-14 13 views
1

上にある整数座標を持つ点の数を(N、0)、(0、N)、および(N) 、N)。プロジェクトオイラー233

それはそのF(10000)= 36

全て正の整数N 1011年よう 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; 
} 
} 

基本的に私がやっていることは、円の内側に刻まれた直角三角形のための解決策を見つけることです円の直径の長さの斜辺を有する。私のコードが正しいことは肯定的ではない。

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

A:それは正しい場合は、私の問題をf(N)関数を最適化すると、fのための番号を見つけるために、ループを最適化され

(N)が420

新しいコードを=いくつかの点:

  1. このために浮動小数点数を使用しないでください。
  2. それ以外は、あなたのアルゴリズムは原則的に正しいです。
  3. しかし、それは宇宙の熱の死の前に終わらないでしょう。整数のみ

    1. 使用数学:

    あなたがより良いアプローチ、いくつかのヒントを見つける必要があります。

  4. 数字理論の紹介を見てください。正方形と直角三角形が面白いかもしれません。ああ、素数。
  5. 楽しんでください。
  6. 私は数学を繰り返すことにします(しかし、非常に基本的な、高校の数学の背景と関連するビットを理解することができます;しかし、少し時間を投資する必要があります)。
+0

-1 project-eulerのアイデアは、自分で解決策を見つけることです。問題ページの一番下から:解決できない場合は解決できません。 http://projecteuler.net/problemsを参照してください。 –

+3

downvoteを説明してくれてありがとう、私はそれを感謝します。私はそれを自分自身で行うという考えをよく知っていますが、ここで与えられた一般的な助言は限界内であり、[フォーラム](http://forum.projecteuler.net)で数多くの問題についてより具体的なヒントを得ることができます。私がまだ関わっていたときに少なくとも1人はできました。 –

+0

フォーラムでは、問題を解決した後、**あなたの解決策について議論することができます。 –

関連する問題