Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我能让这个功能更有效吗(9号项目)?_Java_Algorithm - Fatal编程技术网

Java 我能让这个功能更有效吗(9号项目)?

Java 我能让这个功能更有效吗(9号项目)?,java,algorithm,Java,Algorithm,我刚刚完成项目Euler问题9(警告扰流板): 毕达哥拉斯三元组是一组三个自然数,A

我刚刚完成项目Euler问题9(警告扰流板):

毕达哥拉斯三元组是一组三个自然数,A例如,3^2+4^2=9+16=25=5^2。
只有一个毕达哥拉斯三重态a+b+c=1000。
查找产品abc。
以下是我的解决方案:

public static int specPyth(int num)
{
    for (int a = 1; a < num; a++)
        for (int b = 2; b < a; b++)
            {
                if (a*a +b*b == (num-a-b)*(num-a-b))
                    return a*b*(num-a-b); //ans = 31875000 
            }

    return -1;
}
公共静态int specPyth(int num)
{
for(int a=1;a
我忍不住认为有一种解决方案只涉及一个循环。有人有想法吗?我更喜欢只使用一个循环的答案,但任何比我目前拥有的更有效的答案都会更好

if a + b +c = 1000
然后

然后你尝试每一个b,直到你找到一个由a组成的自然数

public static int specPyth(int num)
    {
        double a;
        for (int b = 1; b < num/2; b++)
        {
            a=(num*num/2 - num*b)/(num - b);

            if (a%1 == 0)
                return (int) (a*b*(num-a-b));
        }   

        return -1;
    }
公共静态int specPyth(int num)
{
双a;
对于(intb=1;b

编辑:b不能高于499,因为c>b和(b+c)将高于1000。

你说
a
,那么
b
必须始终大于
a
,因此第二个循环的起点可以是
b=a+1
;这肯定会减少迭代次数

int specPyth(int num)
{
    for (int a = 1; a < num/3; a++)
        for (int b = a + 1; b < num/2; b++)
        {
            int c = num - a - b;
            if (a * a + b * b == c * c)
                return a * b * c; //ans = 31875000 
        }

    return -1;
}
int specPyth(int num)
{
对于(int a=1;a
首先,因为a是最小的,所以不需要将其计数到num,num/3就足够了,甚至num/(2+sqrt(2))。 第二,有着良好的环境和约束

a+b+c=num
a^2+b^2=c^2
我们可以解这个方程,找到给定a的b和c,它已经满足了这个方程,不需要像现在这样检查a^2+b^2=c^2。您只需检查b和c是否为整数。这是在一个循环中完成的

for (int a = 1; a < num/3; a++)
for(int a=1;a
我强烈建议您阅读和编写一个函数,该函数将逐个生成毕达哥拉斯三元组

不要给太多的扰流板,但有一些其他的PE问题,这个功能将派上用场


(我不认为这有点过分,因为体育的一部分目的是鼓励人们去学习这样的事情。)

< P>绝对不是最理想的解决方案,但我的第一本能是使用一个改进的3SUM。在Python中

def problem_9(max_value = 1000):
    i = 0
    range_of_values = [n for n in range(1, max_value + 1)]
    while i < max_value - 3:
        j = i + 1
        k = max_value - 1
        while j < k:
            a = range_of_values[i]
            b = range_of_values[j]
            c = range_of_values[k]
            if ((a + b + c) == 1000) and (a*a + b*b == c*c):
                return a*b*c
            elif (a + b + c) < 1000:
                j += 1
            else:
                k -= 1
        i += 1
    return -1
def问题9(最大值=1000):
i=0
_值的范围=[n表示范围内的n(1,最大值+1)]
当i
运行时间为62毫秒

    import time
    s = time.time()
    tag,n=True,1000
    for a in xrange (1,n/2):
        if tag==False:
            break
        for b in xrange (1,n/2):
            if a*a + b*b - (n-a-b)*(n-a-b) ==0:
                print a,b,n-a-b
                print a*b*(n-a-b)
                tag=False
    print time.time() - s

在第一个给定的等式中,有三个变量
a、b、c
。如果你想找出这个方程的匹配值,你必须运行三维循环。幸运的是,还有另一个等式
a+b+c=N
,其中
N
是已知数

使用此方法,可以将维度减少到2,因为如果知道三个维度中的两个,则可以计算其余维度。例如,如果您知道
a
b
c
等于
N-a-b

如果你能减少循环的一个维度呢?如果你摆弄两个给定的方程式,这是可能的。拿支笔和纸。一旦你得到两个变量和一个常数(N)的附加方程,你将能够在
O(N)
中获得结果。求解两个方程
a+b+c=n;a^2+b^2=c^2
n
a
为常数,求
b
c

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int t = in.nextInt();
    for(int a0 = 0; a0 < t; a0++){
        int n = in.nextInt(); 
        int max=-1;
        int multi=0;
       int b=1,c=1;
        for(int i=1;i<=n;i++)
            {
            if(2*(i-n)!=0)
            b=(2*i*n-(n*n))/(2*(i-n));
            c=n-b-i;
            if( (i*i+b*b==c*c)&& i+b+c==n && b>0 && c>=0 && i+b>c && c+i>b && b+c>i)
                {
                multi=i*b*c;
                if(max<multi)
                    max=multi;

            }
        }
        if(max==-1)
        System.out.println(-1);
        else
            System.out.println(max);

    }
}
publicstaticvoidmain(字符串[]args){
扫描仪输入=新扫描仪(系统输入);
int t=in.nextInt();
对于(int a0=0;a0=0&&i+b>c&&c+i>b&&b+c>i)
{
multi=i*b*c;
if(maxC)溶液

警告:解决方案假设GCD(a,b)=1。它在这里工作,但可能不总是工作。我将在某个时间修复解决方案

#include <stdio.h>
#include <math.h>

int main(void)
{
  int n = 1000;         // a + b + c = n
  n /= 2;

  for(int r = (int) sqrt(n / 2); r <= (int) sqrt(n); r++)
  {
    if(n % r == 0)
    {
      int s = (n / r) - r;
      printf("%d %d %d\n", r*r - s*s, 2*r*s, r*r + s*s);
      printf("Product is %d\n", (2*r*s) * (r*r - s*s) * (r*r + s*s));
    }
  }

  return 0;
}
#包括
#包括
内部主(空)
{
int n=1000;//a+b+c=n
n/=2;

对于(int r=(int)sqrt(n/2);r
32+42=9+16=25=52
-我不明白-你的意思可能是
3^2+4^2=9+16=25=5^2
3^2+4^2=9+16=25=5^2如果你想要即时加速,用
x*x
而不是
pow(x,2)
。此外,通过穷举搜索寻找平方根显然是需要改进的。你能确认它是a+b+c=1000吗?@MarkoTopolnik,我编辑了我的代码,谢谢。尽管如此,似乎由于trig或一些数学原理的原因,我觉得应该有一种方法可以让它只使用一个for loop来工作。是的,that正是我想要的。谢谢!也谢谢大家。@SteveP。谢谢你的赏金;)当你用num=12=3+4调用函数时,你的函数不会返回正确的答案60+5@jwpat7我明白了:当你使用a=3B=4C=5时,你使用的是num=12,而不是num=1000。然后你有:a=(num*num/2-num*4)/(num-4);->a=(12*6-12*4)/(12-4)=3对;并用num/2替换499。例如,499在i中不起作用
public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int t = in.nextInt();
    for(int a0 = 0; a0 < t; a0++){
        int n = in.nextInt(); 
        int max=-1;
        int multi=0;
       int b=1,c=1;
        for(int i=1;i<=n;i++)
            {
            if(2*(i-n)!=0)
            b=(2*i*n-(n*n))/(2*(i-n));
            c=n-b-i;
            if( (i*i+b*b==c*c)&& i+b+c==n && b>0 && c>=0 && i+b>c && c+i>b && b+c>i)
                {
                multi=i*b*c;
                if(max<multi)
                    max=multi;

            }
        }
        if(max==-1)
        System.out.println(-1);
        else
            System.out.println(max);

    }
}
#include <stdio.h>
#include <math.h>

int main(void)
{
  int n = 1000;         // a + b + c = n
  n /= 2;

  for(int r = (int) sqrt(n / 2); r <= (int) sqrt(n); r++)
  {
    if(n % r == 0)
    {
      int s = (n / r) - r;
      printf("%d %d %d\n", r*r - s*s, 2*r*s, r*r + s*s);
      printf("Product is %d\n", (2*r*s) * (r*r - s*s) * (r*r + s*s));
    }
  }

  return 0;
}