【问题标题】:how do i find the values of A,B and C in java我如何在java中找到A,B和C的值
【发布时间】:2021-05-14 20:02:16
【问题描述】:

给定以下值 X,Y,Z,例如 (0≤X,Y,Z≤10000) 并考虑以下三个方程:

  1. a+b+c = X
  2. abc = Y
  3. a^2 + b^2+ c^2 = Z

我需要找到a、b和c的值,我在java中写了这样的东西:

    for (int a = 0 ; x<= num; x++){
        for(int b =0 ; y<=num; y++){
            for(int c=0 ; z<=num; z++){
                int power = (int) Math.pow(a,2) + (int) Math.pow(b,2)+ (int) Math.pow(c,2); 
                if((x+y+z == X) && (x*y*z==Y) && (power==Z)){
                    System.out.println(a+" "+b+" "+c);
                    System.exit(0);
                }
                
            }
        }
    }
    
    System.out.println("no values found");

但这是一个幼稚的解决方案,因为 a、b 和 c 的值可以是零、正数或负数,并且必须是不同的 (a≠b≠c)。

例如:

  • 输入:6 6 14 - 输出:1 2 3
  • 输入:1 2 3 - 输出:未找到值

输入代表 x,y,z,输出代表 a,b,c。有人可以让我走上正确的道路并帮助我。

【问题讨论】:

  • 您是否考虑过将方程重新排列为f(b,c,X,Y,Z) 的形式并求解a。那么你只需要两个循环。进一步减少也是可能的。
  • 是的,我已经为 b 和 c 使用了 2 个循环并解决了这样的 a= X- (b+c) 但仍然得到错误的答案。 @WJS
  • a,b,c 是多项式 t^3 - X*t^2 + (X^2-Z)/2*t - Y 的零点
  • 对于第三个例子,不是-4^2 + -6^2 + 10^2 = 152 而不是48
  • @NadaAlbargawi 那你肯定打错了,因为正确的答案是 152。对负数进行平方得到正的结果,所以是 16 + 36 + 100,即 152。

标签: java algorithm for-loop if-statement numbers


【解决方案1】:

如果您不想(或不能)通过分析解决它并且保证解决方案是整数(或者您只是在寻找整数解决方案),那么此代码将起作用并且还可以处理负数:

package test;

import java.util.Scanner;

public class TestIntEquation {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        
        long X=in.nextLong();
        long Y=in.nextLong();
        long Z=in.nextLong();

        int[] sign= {1,-1};
        
        for (long a=0;a*a<=Z;a++) {
            for (long b=0;a*a+b*b<=Z;b++) {
                long c=(long) Math.sqrt(Z-a*a-b*b);
                if (a*a+b*b+c*c!=Z) continue;
                long mul=a*b*c;
                if (mul!=Math.abs(Y)) continue;
                for (int signA: sign) {
                    for (int signB: sign) {
                        for (int signC: sign) {
                            if (signA*a==signB*b||signA*a==signC*c||signB*b==signC*c) continue;
                            long sum=signA*a+signB*b+signC*c;
                            mul=signA*a*signB*b*signC*c;
                            if (sum==X&&mul==Y) {
                                System.out.println(a*signA+" "+b*signB+" "+c*signC);
                                return;
                            }
                        }
                    }
                }
            }
        }
        System.out.println("no values found");
    }
}

【讨论】:

  • 非常感谢,非常感谢。祝您度过愉快的一天
猜你喜欢
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多