2016-09-24 3 views
1

Я хочу найти все значения от -100 до 100 для a, b и c, чтобы найти, когда a√2 - b = c√3. Я знаю, что это правда, когда a, b и c равны 0, но я просто хотел создать для него программу.Недостижимый код + как пройти через все комбинации

Я не знаю, что делать, чтобы моя программа могла искать любую возможную комбинацию a, b и c с -100 до 100. Программа, которую я только что создал, сделала a, b и c 1 на каждой итерации, поэтому я не смог получить все комбинации. Я попытался увеличить количество комбинаций, используя «continue», но создал ошибку «недоступный код». Это все равно не дало бы мне всех возможных комбинаций.

Я также попытался увеличить a, b и c на 0.001 после каждой итерации цикла, сделав их удвоенными. Это должно было остановиться на уровне 0,000 ..... но вместо этого оно продолжалось навсегда. Я узнал, что это было связано с тем, что в конце а, b и с было добавлено случайное небольшое число, например 9.4524 x 10^-8 (другое на каждой итерации).

Это мой код:

public static void main(String[] args) { 
    int a = -100; 
    int b = -100; 
    int c = -100; 

    while ((a*Math.sqrt(2)) - b != (c*Math.sqrt(3))) { 
     if (a == 100){ 
      return; 
     } else{ 
      a++; 
      System.out.println("a = " + a); 
      continue; 
     } 

     if (b == 100){ 
      return; 
     } else{ 
      b++; 
      System.out.println("b = " + b); 
      continue; 
     } 

     if (c == 100){ 
      return; 
     } else { 
      c++; 
      System.out.println("c = " + c); 
      continue; 
     } 
    } 
} 

Что я могу сделать, чтобы решить проблемы выше? Любая помощь приветствуется.

Спасибо.

+0

а, б и должны быть целыми числами или двойники? – BadChanneler

+0

Вы можете переставить b = a√2 - c√3 и проверить дробную часть b, используя, таким образом, только двойной цикл. – LutzL

+0

Что с корнем 2 и корнем 3 является иррациональным, я изо всех сил полагаю, что есть какие-то другие решения с целыми номерами, отличные от (0, 0, 0). –

ответ

1

Ваша проблема с тем, как вы увеличивающимся через комбинации a, b и c. Вы хотите проверить для каждого a, для каждого b, для каждого c ли a√2 - b = c√3. Кроме того, для ускорения вашего кода вы можете кэшировать значения √2 и √3, так как они являются константами, пересчитанными на каждой итерации. Кроме того, как вы упомянули в своем вопросе, вы можете столкнуться с ошибками округления в арифметике с плавающей запятой. Поэтому было бы разумно использовать статический метод compare класса Double. Вы можете прочитать об этом here.

Этот код ниже распечатает все целые комбинации a, b и c, которые удовлетворяют уравнению a√2 - b = c√3. Если вы просто ищете одно решение, возможно, возьмите вложенные петли и поместите их в свой собственный метод, а затем, когда условие if выполнено, верните это одно решение. Вы также можете вернуть список решений, добавив каждое решение, соответствующее условиям if, в ArrayList, а затем вернется после завершения циклов.

public class SurdsMain { 
    public static void main(String[] args) { 
     final double SQRT2 = Math.sqrt(2); 
     final double SQRT3 = Math.sqrt(3); 

     for(int a = -100; a <= 100; a++) { 
      for(int b = -100; b <= 100; b++) { 
       for(int c = -100; c <= 100; c++) { 
        if(Double.compare(a * SQRT2 - b, c * SQRT3) == 0) { 
         System.out.println("a = " + a + "; b = " + b + "; c = " + c); 
        } 
       } 
      } 
     } 
    } 
} 
+0

Как бы получить код для распечатки каждой комбинации a, b и c на консоли, когда она проходит через них. Кроме того, не будет ли это добавлять 1 к a, b и c в одно и то же время, как и мое (без «continue;» s). Разве это не так, как работают петли? Извините, я довольно новичок в Java и не написал много программ. –

+1

Нет, все в порядке. Петли for начинаются с a = -100, b = -100 и c = -100. Тогда c будет увеличиваться на единицу, пока не достигнет 100. Затем c сбрасывается на -100, а b увеличивается на единицу. Это повторяется снова и снова, пока b не достигнет 100 (и c достигнет 100 девяносто девять раз), затем b сбрасывается до -100, а увеличивается на 1. Это происходит снова и снова, пока a = 100, после чего петля заканчивается , – kamoroso94

+1

Поскольку петли for являются вложенными, он выполняет цикл внутреннего цикла столько раз, сколько выполняется для цикла for for. Итак, если бы у вас была такая структура, как для (x, 1,2) {для (y, 1,2) {для (z, 1,2) {}}}, она проходила бы (1,1,1), (1,1,2), (1,2,1), (1,2,2), (2,1,1), (2,1,2), (2,2,1), (2 , 2,2). Имеет ли это смысл? – kamoroso94

1

Попробуйте это:

public class Main { 
    // a√2 - b = c√3 
    public static void main(String args[]) throws IOException { 

    for (int a = -100; a < 100; a++) { 
     for (int b = -100; b < 100; b++) { 
     for (int c = -100; c < 100; c++) { 
      // System.out.println(a +" "+b+" "+c); 

      if (BigDecimal.valueOf(a).multiply(BigDecimal.valueOf(Math.sqrt(2))).subtract(BigDecimal.valueOf(b)) 
       .equals(BigDecimal.valueOf(c).multiply(BigDecimal.valueOf(Math.sqrt(3))))) { 
      System.out.println(a + " " + b + " " + c); 

      } 

     } 
     } 
    } 

    } 
} 
1

Вот что вы можете попробовать.

double sqrt2 = Math.sqrt(2.0); 
    double sqrt3 = Math.sqrt(3.0); 
    double threshold = 1e-10; 
    double from = -100; 
    double to = 100; 
    double inc = 1.0; 

    for (double a = from; a <= to; a += inc) { 
     for (double b = from; b <= to; b += inc) { 
      for (double c = from; c <= to; c += inc) { 

       if (Math.abs(a * sqrt2 - b - c * sqrt3) < threshold) { 
        System.out.println("a:" + a + " b:" + b + " c:" + c); 
       } 
      } 
     } 
    } 

Несколько моментов:

  • Когда вы говорите, все числа в диапазоне от -100 до 100, что неоднозначно. Между ними существует неограниченное количество реальных чисел. Если целые числа - это то, что вы хотите, это конечный набор. Если реальные цифры ваша цель, тогда вам нужно выбрать хороший код inc. меньше inc, тем больше чисел вы собираетесь попробовать.
  • Вторая часть: если ваше равенство должно быть приблизительным.Опять же, если вы хотите ровно ровно, то вашими единственными ответами являются три 0, в этом случае используйте (a * sqrt2 - b == c * sqrt3) в вашем if условиях. Но если разница в десятичной запятой приемлема, тогда просто выберите правильный порог в приведенном выше коде, и у вас будет много других ответов.
1

Сначала программа не проверяет все комбинации. Он начинается с a = -100 b = -100 c = -100, но на каждой итерации a b и c увеличивается на 1. Это означает, что на каждой итерации a == b и b == c. Чтобы проверить все возможные combinitions использовать эту петлю

public class BruteChecker{ 
    public static void main(String args[]){ 
     for(double a = -100;a <= 100;a++){ 
      for(double b = -100; b <= 100; b++){ 
       for(double c =-100; c <= 100; c++){ 
        if(a * Math.sqrt(2) - b == c * Math.sqrt(3)){ 
         System.out.println(a + " * sqrt(2) - " + b + " = " + c + " * sqrt(3)"); 
        } 
       } 
      } 
     } 
    } 
} 
Смежные вопросы