2013-09-16 1 views
1

사용자에게 숫자 (대개 큰 숫자)를 묻는 프로그램이있어서 변수 "mu"에 저장합니다. 그런 다음 사용자에게 4 개의 중요한 값을 입력하도록 요청합니다. Im의 생성을 시도하는 공식은 4 개의 중요한 값을 취하여 w, x, y 및 z로 설정합니다. 내가 가지고있는 공식은 그런 것입니다. mu = w^a * x^b * y^c * z^d. 여기서 a, b, c, d는 {{-5, -4, -3, -2, -1, -1/2, -1/3, -1/4, 0, 1/4, 1/3, 1/2, 1, 2, 3, 4, 5}가된다. 프로그램의 요점은 선택된 각 지수가 mu에 가장 근접한 값을 얻을 때까지 각 가능한 값을 통과하는 것입니다. 예를 들어 사용자가 mu를 200,000으로 입력하고 w, x, y, z에 대한 입력 값이 45,180,402,110이면 그런 다음 프로그램 작업은 45^a * 180^b * 402^c * 110^d가 mu 또는 200,000에 가장 근접하도록 지수로 설정할 값을 추측하는 것입니다. 이제는 while 루프를 사용하여이 작업을하려고하지만 내 프로그램은 올바른 추측을 선택하지 않는 것 같습니다. (편집 및 비교 다른 오류를 추가하지만 난 올바른 생각 해달라고) 여기 스퀘어 루트 추측 공식에서 잘못된 값 얻기

지금까지 내 코드입니다 : 어떤 하나에 어떤 통찰력을 가지고

double[] Guess = { -5, -4, -3, -2, -1, -1.0/2, -1/3, -1.0/4.0, 0, 
       1.0/4.0, 1.0/3.0, 1.0/2.0, 1, 2, 3, 4, 5 }; 
     int a = 0; 
     int b = 0; 
     int c = 0; 
     int d = 0; 
     double er = 0.0; 


     out.print("Enter a value for mu:"); 
     double mu = in.nextDouble(); 
     double er1 = Math.abs((mu-mu)/mu); 
     out.print("Enter your first favorite positive value:"); 
     double w = in.nextDouble(); 
     out.print("Enter your second favorite positive value:"); 
     double x = in.nextDouble(); 
     out.print("Enter your third favorite positive value:"); 
     double y = in.nextDouble(); 
     out.print("Enter your fourth favorite positive value:"); 
     double z = in.nextDouble(); 
     while (a < Guess.length) { 
      double W = Math.pow(w, Guess[a]); 
      while (b < Guess.length) { 
       double X = Math.pow(x, Guess[b]); 
       while (c < Guess.length) { 
        double Y = Math.pow(y, Guess[c]); 
        while (d < Guess.length) { 
         double Z = Math.pow(z, Guess[d]); 
         er = ((W * X * Y * Z) - mu)/mu; //calculates percent error 
         if (er < 0) 
         { 
         er = er1 * -1; 
         } 
         if (er < er1){ 
          er1 = er; 
         } 

         d++; 
        } 
        d = 0; 
        c++; 
       } 
       c = 0; 
       b++; 
      } 
      b = 0; 
      a++; 
     } 

     out.print("error = " + er); 

내가 뭘 잘못하고있을 수도 있고 내가 뭘 할 수있다 추가해야합니까? 도와 주셔서 감사합니다! 내 while 루프가 정확한 숫자를 알려줄 것이라는 것을 알고 있지만, 내 a, b, c, d 또는 내 백분율 오차를 corretly 설정하지 않는다고 생각합니다.

EDIT = 점점 더 큰 오류 값입니다. . 엄청난 가치.

+2

1) while 루프가 아닌 for 루프를 사용하면 코드를 정리할 수 있습니다. 2) 오류를 저장하고 가장 작은 값을 가진 대답을 찾을 필요가 있습니다 ... –

+0

나는 * for *를 for 루프로 다시 쓰고 싶을 수도 있습니다. 당신의 논리가 이렇게 분명해질 것입니다. –

+0

for 루프를 사용하면 예를 쉽게 만들 수 있지만, im은 damn while 루프를 사용하여 다시 작성하도록 요청합니다. 나는 여기서 나의 실수를 발견 할 수 없다. – WestonBuckeye

답변

2

이것을 확인하십시오!

public static void main(String[] args) { 
     double[] Guess = { -5, -4, -3, -2, -1, -1.0/2, -1/3, -1.0/4.0, 0, 1.0/4.0, 1.0/3.0, 1.0/2.0, 1, 2, 3, 4, 5 }; 
     int[] Result = {0,0,0,0}; 
     double e = 0.0; 
     boolean first = true; 
     double mu=200000, w=45,x=180,y=402,z=110; 

     for(int a = 0; a<Guess.length; a++) 
     { 
      double W = Math.pow(w,Guess[a]); 
      for(int b = 0; b<Guess.length; b++) 
      { 
       double X = Math.pow(x,Guess[b]); 
       for(int c = 0; c<Guess.length; c++) 
       { 
        double Y = Math.pow(y, Guess[c]); 
        for(int d = 0; d<Guess.length; d++) 
        { 
         double Z = Math.pow(z, Guess[d]); 
         double temp = Math.abs (W*X*Y*Z - mu); 
         if (first) 
         { 
          e = temp; 
          first = false; 
         } 
         else if (temp<e) 
         { 
          e=temp; 
          Result[0]=a; 
          Result[1]=b; 
          Result[2]=c; 
          Result[3]=d; 
         } 
        } 
       } 
      } 
     } 

     System.out.print("Error = " + e*100/mu + '\n'); 
     System.out.print("a=" + Guess[Result[0]] + "\nb=" + Guess[Result[1]] + "\nc=" + Guess[Result[2]] + "\nd=" + Guess[Result[3]] + '\n'); 
     }