项目欧拉233

And*_*luk 1 c#

设f(N)是在通过(0,0),(N,0),(0,N)和(N,N)的圆上具有整数坐标的点的数量.

可以证明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;
}
}
Run Code Online (Sandbox Code Playgroud)

基本上我正在做的是找到刻在圆圈内的直角三角形的解决方案,斜边是圆直径的长度.我并不认为我的代码是正确的.

如果它是正确的,那么我的问题是优化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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*her 6

几点:

  1. 不要使用浮点数.
  2. 除此之外,您的算法原则上是正确的.
  3. 但它不会在宇宙热死之前完成.

你必须找到一个更好的方法,一些提示:

  1. 仅使用整数数学.
  2. 看看数论的介绍.正方形和直角三角形可能很有趣.哦,和素数.
  3. 玩得开心.
  4. 让我重复一下,数论(但非常基础,你可以理解高中数学背景的相关部分;你将不得不投入一点时间).

  • 感谢您解释downvote,我很感激.我知道自己做得很好的想法,但是这里给出的一般建议是在极限范围内,你可以在[论坛](http://forum.projecteuler.net)上获得更多关于众多问题的具体提示 - 或者当我还在参与时,至少有一个可能. (3认同)
  • @userunknown哪些破坏者在你身边?为了清楚起见,我发现你的提示方式有点夸张,但并非根本错误.提示应该不太明确.但是,在正确的方向上小心翼翼地推动人们是游戏的重要组成部分,我们都参与其中.我认为我的暗示(不要这样做,而是学习一些基本数论)是足够的,我的答案的部分原因是阻止更明确的指导.当然,你有权不同意.合理的人可以在不同的点画线. (3认同)