2013-08-22 2 views
5

के साथ एक एकल चर x बहुपद को देखते हुए, और इनपुट के रूप में एक्स का मान का उपयोग कर, अपने मूल्य की गणना के बिना बहुपद स्ट्रिंग का मूल्यांकन करें। उदाहरण:regex और एपीआई

मुद्दे के
eval("-2x^3+10x-4x^2","3")=-60 

eval("x^3+x^2+x","6")=258 

विवरण: इस कोड में मैं एक स्ट्रिंग में स्ट्रिंग को तोड़ने जब भी कोई +/- का सामना करना पड़ा और एक समारोह जो की तरह "-2x^3" एकल अवधि का मूल्यांकन करता है करने के लिए स्ट्रिंग पारित किया गया है। तो इनपुट के लिए मेरा कोड = "-2x^3 + 10x-4x^2" केवल "-2x^3 + 10x" तक गणना करता है और "-4x^2" भाग छोड़ देता है।

क्या कोई मुझे बता सकता है कि यहां क्या गलत है? - या +, और यह मूल्यांकन करने

  if(str.charAt(i) == '-' || str.charAt(i) == '+') 
      { 
       subStr = str.substring(0, i); 

प्रभाव है कि आप लेख संदेश भेजना सिर्फ से पहले substr स्थापित कर रहे है:

public class EvalPolyX2 { 

    static String testcase1 = "-2x^3+10x-4x^2"; 
    static String testcase2 = "3"; 

    public static void main(String args[]){ 
     EvalPolyX2 testInstance = new EvalPolyX2(); 
     int result = testInstance.eval(testcase1,testcase2); 
     System.out.println("Result : "+result); 
    } 

    public int eval(String str,String valx){ 

     int sum = 0;   
     String subStr = ""; 
     if(str.charAt(0) == '-') 
     { 
      int len = str.length(); 
      for (int i = 0; i < len; i++) 
      { 
       if(str.charAt(i) == '-' || str.charAt(i) == '+') 
       {     
        subStr = str.substring(0, i); 
        System.out.println("subStr="+subStr); 
        sum += evalSubPoly(subStr, valx); 
        str = str.substring(i); 
        len = str.length(); 
        i = 0; 
       }    
      } 
     } 
     else if(str.charAt(0) != '-') 
     { 
      str = '+' + str; 
      int len = str.length(); 
      for (int i = 0; i < len; i++) 
      { 
       if(str.charAt(i) == '-' || str.charAt(i) == '+') 
       { 
        subStr = str.substring(0, i); 
        System.out.println("subStr="+subStr); 
        sum += evalSubPoly(subStr, valx); 
        str = str.substring(i); 
        len = str.length(); 
        i=0; 
       } 
      } 
     } 
     return sum; 
    } 

    public int evalSubPoly(String poly,String valx){ 
     int len = poly.length(); 
     String num = ""; 
     String power = ""; 
     int exp = 0, coeff = 0; 

     for(int i = 0; i < len; i++) 
     { 
      if(poly.charAt(i) == 'x') 
      { 
       num = poly.substring(0, i); 
       coeff = Integer.parseInt(num);        
      } 
      if(poly.charAt(i) == '^') 
      { 
       power = poly.substring(i+1, len); 
       exp = Integer.parseInt(power); 
      }      
     } 

     if(power.equals("")) 
      exp = 1; 
     System.out.println("coeff="+coeff); 

     int sum = 1; 
     int x = Integer.parseInt(valx); 

     for (int i = 0; i < exp; i++) 
     { 
      sum = sum*x; 
     } 
     System.out.println("sum="+sum); 
     sum = sum*coeff; 

     return sum; 
    } 
} 
+0

मुझे अलग तरीके से व्यक्त करते हैं - जब आपके कोड नमूना चलाने के लिए है के रूप में की कोशिश कर रहा है, मैं 'मिल धागा" मुख्य "java.lang.NumberFormatException में अपवाद: इनपुट स्ट्रिंग के लिए:" 10 "'। इसका मतलब है कि आपका कोड नमूना समस्या को पुन: उत्पन्न नहीं करता है, जो हमारे लिए जीवन को और अधिक कठिन बनाता है। – Dukeling

+0

डुक्लिंग सही है, क्योंकि आप इसे प्राप्त करने के बाद स्ट्रिंग में +/- साइन शामिल कर रहे हैं। इससे बचने के लिए, आपको 'str = str.substring (i); 'str = str.substring (i + 1) होना चाहिए;' जिस तरह से बाकी स्ट्रिंग +/- के बाद शुरू होती है यह। –

+0

लेकिन अगर उसे '-' है तो उसे शामिल करने की आवश्यकता नहीं है? अन्यथा तथ्य यह है कि '+' की बजाय '-' पूरी तरह से खो जाता है। – ajb

उत्तर

1

ऊपर मेरी टिप्पणी में उल्लेख करने के लिए जोड़ा परिवर्तन इस कोड को बदलने की मदद करनी चाहिए

if(str.charAt(i) == '-' || str.charAt(i) == '+' || i == (len - 1)) 
    { 
    if(i == len - 1) 
    { 
    i++; 
    } 
    ... 

हालांकि बेहतर तरीके से हो सकता है, लेकिन मैं केवल एक रास्ता दिखाने के लिए करना चाहता था यहाँ से बाहर। कारण आप + या - delimiter के रूप में देख रहे हैं। लेकिन अभिव्यक्ति के अंतिम भाग इनमें से किसी लेकिन साथ समाप्त नहीं होगा सिर्फ शायद EOL

+0

आपका और @ डुकलिंग के सुझाव ने युगल किया था! धन्यवाद। – abhishek14d

0

सरल उत्तर जब आप यह करते हैं कि है। लेकिन चूंकि स्ट्रिंग के अंत में कोई - या + नहीं है, इसलिए कोई तर्क नहीं है कि यह तर्क बहुपद की अंतिम अवधि का मूल्यांकन करेगा, क्योंकि यह केवल उप-वर्गों का मूल्यांकन करता है जो एक या + से पहले हैं।

पीएस मैंने देखा एक समस्या है। मुझे नहीं पता कि बाकी तर्क सही है या नहीं।

0

जब आप स्ट्रिंग पार्स, आप के लिए +/- देखने के लिए और केवल यदि आप उन्हें खोजने के बंद करो। यह पहले दो शब्दों के लिए काम करता है, लेकिन जब आप "-4x^2" पर उतरते हैं तो लूप रुक जाएगा क्योंकि कोई +/- नहीं है। तो आपके पास स्थितियों के अतिरिक्त, आपको कोड जोड़ने की आवश्यकता है ताकि जब स्ट्रिंग का अंत तक पहुंचा जा सके, जो आपने छोड़ा है वह अंतिम शब्द है। तो क्या आप करना चाहते हैं इस

if(str.charAt(0) == '-') 
    { 
     int len = str.length(); 
     for (int i = 0; i < len; i++) 
     { 
      if(str.charAt(i) == '-' || str.charAt(i) == '+') 
      {     
       subStr = str.substring(0, i); 
       System.out.println("subStr="+subStr); 
       sum += evalSubPoly(subStr, valx); 
       str = str.substring(i+1); 
       len = str.length(); 
       i = 0; 
      }    
     } 
     System.out.println("subStr="+str); 
     sum += evalSubPoly(str, valx); 
    } 


    else if(str.charAt(0) != '-') 
    { 
     str = '+' + str; 
     int len = str.length(); 
     for (int i = 0; i < len; i++) 
     { 
      if(str.charAt(i) == '-' || str.charAt(i) == '+') 
      { 
       subStr = str.substring(0, i); 
       System.out.println("subStr="+subStr); 
       sum += evalSubPoly(subStr, valx); 
       str = str.substring(i+1); 
       len = str.length(); 
       i=0; 
      } 
     } 
     System.out.println("subStr="+str); 
     sum += evalSubPoly(str, valx); 
    } 

मैं भी त्याग है कि वहाँ अधिक त्रुटियों हो सकता है बाहर फेंक जाएगा, लेकिन इस प्रमुख एक अपने समस्या खड़ी कर रहा है।

संपादित करें: else if बयान और कहा कि परिवर्तन

1
  1. आप (जब एक - या + पाया जाता है-बयान केवल ट्रिगर किया जाएगा पिछले अवधि के लिए खाते में करने की जरूरत है, जो अंत में नहीं है)।

    एक आसान तरीका यह करने के लिए बदलने के लिए है:

    साथ
    for (int i = 0; i < len; i++) 
    { 
        if (str.charAt(i) == '-' || str.charAt(i) == '+') 
    

    :

    //     v one more iteration 
    for (int i = 0; i <= len; i++) 
    { 
        if (i == len || str.charAt(i) == '-' || str.charAt(i) == '+') 
    //  \------/ 
    // extra condition 
    

    ऊपर बस एक और यात्रा के लिए पर चला जाता है और उस यात्रा पर,, हमेशा करता है, तो में चला जाता है -स्टेटमेंट, आखिरी अवधि को संसाधित करने का कारण बनता है।

  2. तुम भी सरल बना सकते हैं

    if (str.charAt(0) == '-') 
    { 
        // common code 
    } 
    else if (str.charAt(0) != '-') 
    { 
        str = '+' + str; 
        // common code 
    } 
    

    करने के लिए:

    if (str.charAt(0) != '-') 
    { 
        str = '+' + str; 
    } 
    // common code 
    
  3. भी + से निपटने के साथ एक बग नहीं है। मुझे इसके लिए NumberFormatException मिल गया है। एक तरह से इसे संभाल करने के लिए शब्दों के बीच + अनदेखी करने के लिए (और शुरू करने के लिए एक + जोड़ने नहीं) है:

    if (i != len && str.charAt(i) == '+') 
        str = str.substring(i+1); 
    else 
        str = str.substring(i); 
    
  4. और आप अपने कार्यों static और उन्हें फोन सीधे के बजाय एक नई घोषित हो सकता है आपकी कक्षा का उदाहरण

Test

+1

असल में यह (i == len-1) होना चाहिए यदि अंदर। इसने काम कर दिया। धन्यवाद! – abhishek14d

+1

@ abhishek14d ['i == len' ठीक काम करता प्रतीत होता है।] (Https://ideone.com/ikOFlX) ने मेरे उत्तर में कुछ जोड़ दिए। – Dukeling

2

रेगेक्स का उपयोग करने में क्या गलत है? आप बहुपदों को monomials में विभाजित कर सकते हैं, प्रत्येक का मूल्यांकन कर सकते हैं, और सभी परिणामों को जोड़ सकते हैं।

private static final Pattern monomial = Pattern 
     .compile("([+-])?(\\d+)?x(?:\\^(\\d+))?"); 

public static int eval(String str, String valx) { 
    Matcher m = monomial.matcher(str); 
    int x = Integer.parseInt(valx); 

    int total = 0; 
    while (m.find()) { 
     String mul = m.group(2); 
     int value = (mul == null) ? 1 : Integer.parseInt(m.group(2)); 

     String pow = m.group(3); 
     value *= (pow == null) ? x : (int) Math.pow(x, 
       Integer.parseInt(pow)); 

     if ("-".equals(m.group(1))) 
      value = -value; 

     total += value; 
    } 

    return total; 
} 

System.out.println(eval("-2x^3+10x-4x^2", "3")); 
System.out.println(eval("x^3+x^2+x", "6")); 
 
-60 
258 
+0

निश्चित रूप से स्पष्ट (और यह वही सटीक रेगेक्स है जो मैंने उपयोग किया होगा), लेकिन शीर्षक मुझे लगता है कि यह एक वर्ग असाइनमेंट है और regexes वर्जित हैं। – ajb

0

नियमित अभिव्यक्ति के साथ, आप एक और अधिक सरल समाधान प्राप्त कर सकते हैं। और, क्या आप सरल स्थिरांक के लिए समर्थन चाहते हैं? अगले का प्रयास करें:

public class EvalPolyX2 { 
    public static void main(String args[]) { 
     System.out.println("Result: " + eval("x^3+x^2+x", 6)); 
    } 
    public static int eval(String eq, int val) { 
     int result = 0; 
     String mons[] = eq.split("(?=[+-])(?!\\B)"); 
     for (String str : mons) { 
      str = str.replace("+", ""); 
      if (str.contains("x")) { 
       double a = 1, b = 1; 
       String[] comps = str.split("x\\^?"); 
       if (comps.length > 0) { 
        a = comps[0].isEmpty() ? 1 : Integer.parseInt(comps[0]); 
       } 
       if (comps.length > 1) { 
        b = Integer.parseInt(comps[1]); 
       } 
       result += a * Math.pow(val, b); 
      } else { 
       result += Integer.parseInt(str); 
      } 
     } 
     return result; 
    } 
}